cursorpython
本文Python 操作 MySQL 資料庫需要是使用到 PyMySQL 驅動
Python 操作 MySQL 前提是要安裝好 MySQL 資料庫並能正常連接使用,安裝步驟詳見下文。
注意: 安裝過程我們需要通過開啟管理員許可權來安裝,否則會由於許可權不足導致無法安裝。
首先需要先下載 MySQL 安裝包, 官網下載地址 下載對應版本即可,或直接在網上拉取並安裝:
許可權設置:
初始化 MySQL:
啟動 MySQL:
查看 MySQL 運行狀態:
Mysql安裝成功後,默認的root用戶密碼為空,你可以使用以下命令來創建root用戶的密碼:
登陸:
創建資料庫:
查看資料庫:
PyMySQL 模塊使用 pip命令進行安裝:
假如系統不支持 pip 命令,可以使用以下方式安裝:
pymysql .connect 函數:連接上資料庫
輸出結果顯示如下:表面資料庫連接成功
使用 pymysql 的 connect() 方法連接資料庫,connect 參數解釋如下:
conn.cursor():獲取游標
如果要操作資料庫,光連接數據是不夠的,咱們必須拿到操作資料庫的游標,才能進行後續的操作,游標的主要作用是用來接收資料庫操作後的返回結果,比如讀取數據、添加數據。通過獲取到的資料庫連接實例 conn 下的 cursor() 方法來創建游標,實例如下:
輸出結果為:
cursor 返回一個游標實例對象,其中包含了很多操作數據的方法,如執行sql語句,sql 執行命令: execute() 和 executemany()
execute(query,args=None):
executemany(query,args=None):
其他游標對象如下表:
完整資料庫連接操作實例如下:
以上結果輸出為:
創建表代碼如下:
如下所示資料庫表創建成功:
插入數據實現代碼:
插入數據結果:
Python查詢Mysql使用 fetchone() 方法獲取單條數據, 使用fetchall() 方法獲取多條數據。
查詢數據代碼如下:
輸出結果:
DB API中定義了一些資料庫操作的錯誤及異常,下表列出了這些錯誤和異常:
本文給大家介紹 Python 如何連接 Mysql 進行數據的增刪改查操作,文章通過簡潔的代碼方式進行示例演示,給使用 Python 操作 Mysql 的工程師提供支撐。
2. python 中cursor的用法
def getallinfo(x,y):
#x為資料庫,y為sql
coon=pymysql.connect(user='root',passwd='123456',db=x,port=3306,host='127.0.0.1',charset='utf8')
cursor=coon.cursor()
cursor.execute(y)
res=cursor.fetchall()
cursor.close()
coon.close()
return res
3. cursor收費嗎
cursor不收費。
chartgpt大火之後,隨之而來的就是一大類衍生物了。然後,今天要給大家介紹的是一款基於GPT4的新一代輔助編程神器——Cursor。它最值得介紹的地方在於它免費,我們可以直接利用它來輔助我們編程,真正做到事半功倍。最近出現的一個叫Cursor的編輯器已經集成了openai的GPT-4,而且還是免費的,它將徹底改變我們寫代碼的方式。官網上介紹說:BuildSoftware.Fast.(快速構建軟體),在新型編輯器中使用GPT-4編寫、編輯代碼並進行聊天。它支持多種編程語言,如Python,Java,C#,JavaScript等,並且可以根據你的輸入和需求自動生成代碼片段。Cursor編輯器還可以幫助你重構、理解和優化代碼,提高開發效率。你可以使用任何一種你比較熟悉的工作流,常規的、Vim、Emac都可以用,而且還支持遠程鏈接伺服器。這確實是驚喜的也是顛覆的,一方面,它確實可以幫助程序員提高編碼效率和質量,可以通過使用人工智慧技術來生成代碼、檢測錯誤、提供建議等。另一方面,它也可能威脅到程序員的職業前景,在我看來人工智慧幾乎可以取代中級程序員,一些基洞舉頃礎的碼農完全可以被取代了。答扮因此,程序員需要不納陸斷地學習和適應新的技術和需求,以保持自己的競爭力和創造力。
4. python可以建立多個游標嗎
cursor就是一個Cursor對象,這個cursor是一個實現了迭代器(def__iter__())和生成器(yield)的MySQLdb對象,這個時候cursor中還沒有數據,只有等到fetchone()或fetchall()的時候才返回一個元組tuple,才支持len()和index()操作,這也是它是迭代器的原因。但同時為什麼說它是生成器呢?因為cursor只能用一次,即每用完一次之後記錄其位置,等到下次再取的時候是從游標處再取而不是從頭再來,而且fetch完所有的數據之後,這個cursor將不再有使用價值了,即不再能fetch到數據了。
資料庫支持
使用簡單的純文本只能實現有退限的功能,所需要引入資料庫,完成更強大的功能,本節使用的簡單資料庫SQLite 。
SQLite 和PySQLite
sqlite是非常著名的開源嵌入式資料庫軟體,它可以嵌入到其他程序中使用,並且提供SQL介面用來查詢,非常方便。它的官方站點為http://www.sqlite.org。
而pysqlite 則是一個sqlite 為 python 提供的 api 介面,它讓一切對於 sqlite 的操作都變得異常簡單
在python2.5版本這後,SQLite的優勢在於它的一個包裝(PySQLite)已經被包括在標准庫內,所以我們可以直接使用。
入門操作
可以將SQLite作為名為sqlite3的模塊導入。之後就可以創建一個到資料庫文件的連接----如果文件不存在就會被創建----通過提供一個文件名:
>>> import sqlite3
>>> conn= sqlite3.connect('somedatabase.db') # 創建資料庫
>>>cu =conn.cursor() #能獲得連接的游標
#創建數據表
>>>cu.execute("""create table catalog (
id integer primary key,
pid integer,
name varchar(10) UNIQUE
)""")
#插入兩條數據
>>>cu.execute("insert into catalog values(0,0,'name1')")
>>>cu.execute("insert into catalog values(1,0,'name2')")
>>>conn.commit()
#選擇(select)
>>>cu.execute("select * from catalog")
>>>cu.fetchall()
[(0, 0, 'name1'), (1, 0, 'name2')]
>>>cu.execute("select * from catalog where id = 1")
>>>cu.fetchall()
[(1, 0, 'name2')]
#修改(update)
>>>cu.execute(「update catalog set name=』name2′ where id = 0″)
>>> cx.commit()
>>> cu.execute(「select * from catalog」)
>>> cu.fetchone()
(0, 0, 『name2′)
#刪除(delete)
>>>cu.execute(「delete from catalog where id= 1″)
>>> cx.commit()
>>> cu.execute(「select * from catalog」)
>>> cu.fetchall()
[(0, 0, 'name2')]
連接
為了使用基礎資料庫系統,首先必須連接到它,這個時候需要使用具有名稱的connect函數,該函數有多個參數,而具體用哪個參數取決於資料庫。
connect函數的常用參數:
connect函數返回連接對象。這個對象表示目前和資料庫的會話。連接對象支持的方法如下;
連接對象方法:
commit 方法總是可用的,但如果資料庫不支持事務,它就沒有任何作用。如果關閉了連接但還有未提交的事務,它們會隱式地回滾---但是只有在資料庫支持持回滾的時候才可以。
rollback 方法可能不可用,因為不是所有的資料庫都支持事務(事務是一系列動作)。如果可用,那麼就可以「撤銷」所有未提交的事務。
cursor 方法將我們引入另外一個主題:游標對象。通過游標掃行SQL 查詢並檢查結果。游標連接支持更多的方法,而且可能在程序中更好用。
游標:
cu = conn.cursor()
能獲得連接的游標,這個游標可以用來執行SQL查詢。
conn.commit()
完成插入並且做出某些更改後確保已經進行了提交,這樣才可以將這些修改真正地保存到文件中。
游標對象方法:
游標對象特性:
cu.fetchone()
fetchall()返回結果集中的全部數據,結果為一個tuple的列表。每個tuple元素是按建表的欄位順序排列。注意,游標是有狀態的,它可以記錄當前已經取到結果的第幾個記錄了,因此,一般你只可以遍歷結果集一次。在上面的情況下,如果執行fetchone()會返回為空。這一點在測試時需要注意。
conn.close()
可以在每次修改資料庫後都進行提交,而不是僅僅在准備關閉才提交,准備關閉數據時,使用close 方法。
5. python進程池如何避免資料庫游標關閉當進程池運行時,主進程會關閉cursor。導致無法將數據插入資料庫。
Python提供了非常好用的多進程包multiprocessing,你只需要定義一個函數,Python會替你完成其他所有事情。
藉助這個包,可以輕松完成從單進程到並發執行的轉換。
1、新建單一進程
如果我們新建少量進程,可以如下:
import multiprocessing
import time
def func(msg):
for i in xrange(3):
print msg
time.sleep(1)
if __name__ == "__main__":
p = multiprocessing.Process(target=func, args=("hello", ))
p.start()
p.join()
print "Sub-process done."12345678910111213
2、使用進程池
是的,你沒有看錯,不是線程池。它可以讓你跑滿多核CPU,而且使用方法非常簡單。
注意要用apply_async,如果落下async,就變成阻塞版本了。
processes=4是最多並發進程數量。
import multiprocessing
import time
def func(msg):
for i in xrange(3):
print msg
time.sleep(1)
if __name__ == "__main__":
pool = multiprocessing.Pool(processes=4)
for i in xrange(10):
msg = "hello %d" %(i)
pool.apply_async(func, (msg, ))
pool.close()
pool.join()
print "Sub-process(es) done."12345678910111213141516
3、使用Pool,並需要關注結果
更多的時候,我們不僅需要多進程執行,還需要關注每個進程的執行結果,如下:
import multiprocessing
import time
def func(msg):
for i in xrange(3):
print msg
time.sleep(1)
return "done " + msg
if __name__ == "__main__":
pool = multiprocessing.Pool(processes=4)
result = []
for i in xrange(10):
msg = "hello %d" %(i)
result.append(pool.apply_async(func, (msg, )))
pool.close()
pool.join()
for res in result:
print res.get()
print "Sub-process(es) done."
2014.12.25更新
根據網友評論中的反饋,在Windows下運行有可能崩潰(開啟了一大堆新窗口、進程),可以通過如下調用來解決:
multiprocessing.freeze_support()1
附錄(自己的腳本):
#!/usr/bin/python
import threading
import subprocess
import datetime
import multiprocessing
def dd_test(round, th):
test_file_arg = 'of=/zbkc/test_mds_crash/1m_%s_%s_{}' %(round, th)
command = "seq 100 | xargs -i dd if=/dev/zero %s bs=1M count=1" %test_file_arg
print command
subprocess.call(command,shell=True,stdout=open('/dev/null','w'),stderr=subprocess.STDOUT)
def mds_stat(round):
p = subprocess.Popen("zbkc mds stat", shell = True, stdout = subprocess.PIPE)
out = p.stdout.readlines()
if out[0].find('active') != -1:
command = "echo '0205pm %s round mds status OK, %s' >> /round_record" %(round, datetime.datetime.now())
command_2 = "time (ls /zbkc/test_mds_crash/) 2>>/round_record"
command_3 = "ls /zbkc/test_mds_crash | wc -l >> /round_record"
subprocess.call(command,shell=True)
subprocess.call(command_2,shell=True)
subprocess.call(command_3,shell=True)
return 1
else:
command = "echo '0205 %s round mds status abnormal, %s, %s' >> /round_record" %(round, out[0], datetime.datetime.now())
subprocess.call(command,shell=True)
return 0
#threads = []
for round in range(1, 1600):
pool = multiprocessing.Pool(processes = 10) #使用進程池
for th in range(10):
# th_name = "thread-" + str(th)
# threads.append(th_name) #添加線程到線程列表
# threading.Thread(target = dd_test, args = (round, th), name = th_name).start() #創建多線程任務
pool.apply_async(dd_test, (round, th))
pool.close()
pool.join()
#等待線程完成
# for t in threads:
# t.join()
if mds_stat(round) == 0:
subprocess.call("zbkc -s",shell=True)
break
6. python連接MySQL資料庫問題 cursor( ) 、execute()和fetchall( )方法的作用
cucursor()方法的作用?獲取操作游標
- execute方法的作用?執行SQL,括弧里的是sql語句
- fetchall()方法滴作用?返回查詢到的所有記錄