本文目錄一覽:
Python3 MySQL executemany的使用?
題主你好,
從你的代碼來說, 你的問題出在對executemany(sql, data)這個方法的邏輯沒弄明白.
咱們對比一下execute(sql)和executemany(sql, data), 這裡假設sql執行的是插入操作:
前者是執行單條操作,要插入的數據是寫死在sql這個字元串中的;
後者是批量執行插入操作.關鍵的地方在於sql參數中留出格式化字元, 而數據是從data中取,這麼說不好理解,看例子吧:
sql改為:
sql = “INSERT INTO bbb(nu1, nu2, nu3) VALUES (%s, %s, %s)”
注意和你的對比一下:
sql = “INSERT INTO bbb(nu1, nu2, nu3) VALUES (%s, %s, %s)” % (aa,bb,cc)
—–
關鍵是data參數,有兩種寫法,一種是序列內嵌, 一種是字典:
序列內嵌(外層必須是列表, 內層元素是列表或元組)
data=[[1,2,3],[4,5,6],[7,8,9]]
data=[(1,2,3),(4,5,6),(7,8,9)]
字典:
使用字典時,sql也要相應的改一下:
sql = “INSERT INTO bbb(nu1, nu2, nu3) VALUES (%(nu1)s, %(nu2)s, %(nu3)s)”
data參數外層還是一個列表, 內層元素是一個個的字典,即一個字典表示一條將要被插入的數據:
data = [ { ‘nu1’:1, ‘nu2’:2, ‘nu3’:3 }, { ‘nu1’:1, ‘nu2’:2, ‘nu3’:3 } ]
—–
再說下最終的邏輯:
序列內嵌法:
1.可以使用for循環先得到一個外層是列表,內層元素是列表或元組的這的一個列表:
ll= []
for i in itertools.permutations(range(1,8),3):
ll.append(i)
2.然後再構建sql語句:
sql = “INSERT INTO bbb(nu1, nu2, nu3) VALUES (%s, %s, %s)”
3.調用executemany():
cursor.executemany(sql,ll)
4.最後調用commit(),提交給資料庫執行:
yydd.commit()
—–
字典法的邏輯:
1.使用for循環構建一個元素是字典的列表:
ll= []
for i in itertools.permutations(range(1,8),3):
ll.append({‘nu1’:i[0], ‘nu2’:i[1], ‘nu3’:i[2]})
2.構建sql語句:
sql = “INSERT INTO bbb(nu1, nu2, nu3) VALUES (%(nu1)s, %(nu2)s, %(nu3)s)”
3,4步同序列內嵌法中的描述.
=====
希望可以幫到題主, 歡迎追問
如何使用python連接mysql資料庫
在 Python 語言環境下我們這樣連接資料庫。
In [1]: from mysql import connector
In [2]: cnx = connector.connect(host=”172.16.192.100″,port=3306,user=”appuser”,password=”xxxxxx”)
但是連接資料庫的背後發生了什麼呢?
答案
當我們通過驅動程序(mysql-connector-python,pymysql)連接 MySQL 服務端的時候,就是把連接參數傳遞給驅動程序,驅動程序再根據參數會發起到 MySQL 服務端的 TCP 連接。當 TCP 連接建立之後驅動程序與服務端之間會按特定的格式和次序交換數據包,數據包的格式和發送次序由 MySQL 協議 規定。MySQL 協議:整個連接的過程中 MySQL 服務端與驅動程序之間,按如下的次序發送了這些包。
MySQL 服務端向客戶端發送一個握手包,包里記錄了 MySQL-Server 的版本,默認的授權插件,密碼鹽值(auth-data)。
2. MySQL 客戶端發出 ssl 連接請求包(如果有必要的話)。
3. MySQL 客戶端發出握手包的響應包,這個包時記錄了用戶名,密碼加密後的串,客戶端屬性,等等其它信息。
4. MySQL 服務端發出響應包,這個包里記錄了登錄是否成功,如果沒有成功也會給出錯誤信息。
python怎麼操作mysql
我採用的是MySQLdb操作的MYSQL資料庫。先來一個簡單的例子吧:
import MySQLdb
try:
conn=MySQLdb.connect(host=’localhost’,user=’root’,passwd=’root’,db=’test’,port=3306)
cur=conn.cursor()
cur.execute(‘select * from user’)
cur.close()
conn.close()
except MySQLdb.Error,e:
print “Mysql Error %d: %s” % (e.args[0], e.args[1])
請注意修改你的資料庫,主機名,用戶名,密碼。
下面來大致演示一下插入數據,批量插入數據,更新數據的例子吧:
import MySQLdb
try:
conn=MySQLdb.connect(host=’localhost’,user=’root’,passwd=’root’,port=3306)
cur=conn.cursor()
cur.execute(‘create database if not exists python’)
conn.select_db(‘python’)
cur.execute(‘create table test(id int,info varchar(20))’)
value=[1,’hi rollen’]
cur.execute(‘insert into test values(%s,%s)’,value)
values=[]
for i in range(20):
values.append((i,’hi rollen’+str(i)))
cur.executemany(‘insert into test values(%s,%s)’,values)
cur.execute(‘update test set info=”I am rollen” where id=3’)
conn.commit()
cur.close()
conn.close()
except MySQLdb.Error,e:
print “Mysql Error %d: %s” % (e.args[0], e.args[1])
請注意一定要有conn.commit()這句來提交事務,要不然不能真正的插入數據。
運行之後我的MySQL資料庫的結果就不上圖了。
import MySQLdb
try:
conn=MySQLdb.connect(host=’localhost’,user=’root’,passwd=’root’,port=3306)
cur=conn.cursor()
conn.select_db(‘python’)
count=cur.execute(‘select * from test’)
print ‘there has %s rows record’ % count
result=cur.fetchone()
print result
print ‘ID: %s info %s’ % result
results=cur.fetchmany(5)
for r in results:
print r
print ‘==’*10
cur.scroll(0,mode=’absolute’)
results=cur.fetchall()
for r in results:
print r[1]
conn.commit()
cur.close()
conn.close()
except MySQLdb.Error,e:
print “Mysql Error %d: %s” % (e.args[0], e.args[1])
運行結果就不貼了,太長了。
查詢後中文會正確顯示,但在資料庫中卻是亂碼的。經過我從網上查找,發現用一個屬性有可搞定:
在Python代碼
conn = MySQLdb.Connect(host=’localhost’, user=’root’, passwd=’root’, db=’python’) 中加一個屬性:
改為:
conn = MySQLdb.Connect(host=’localhost’, user=’root’, passwd=’root’, db=’python’,charset=’utf8′)
charset是要跟你資料庫的編碼一樣,如果是資料庫是gb2312 ,則寫charset=’gb2312’。
下面貼一下常用的函數:
然後,這個連接對象也提供了對事務操作的支持,標準的方法
commit() 提交
rollback() 回滾
cursor用來執行命令的方法:
callproc(self, procname, args):用來執行存儲過程,接收的參數為存儲過程名和參數列表,返回值為受影響的行數
execute(self, query, args):執行單條sql語句,接收的參數為sql語句本身和使用的參數列表,返回值為受影響的行數
executemany(self, query, args):執行單挑sql語句,但是重複執行參數列表裡的參數,返回值為受影響的行數
nextset(self):移動到下一個結果集
cursor用來接收返回值的方法:
fetchall(self):接收全部的返回結果行.
fetchmany(self, size=None):接收size條返回結果行.如果size的值大於返回的結果行的數量,則會返回cursor.arraysize條數據.
fetchone(self):返回一條結果行.
scroll(self, value, mode=’relative’):移動指針到某一行.如果mode=’relative’,則表示從當前所在行移動value條,如果 mode=’absolute’,則表示從結果集的第一行移動value條.
參考資料:
MySQLdb『s user guide
package MySQLdb
如何使用Python3.4連接MySQL
序號 描述
1 去github上下載pymysql的安裝包pymysql
2 解壓到某個盤符下
3 打開cmd窗口(win環境下),進入pymysql的根目錄下執行命令,python setup.py install
4 在程序里,導入pymysql
5 開始連接資料庫
資料庫操作的API文檔連接:
代碼如下:
Python代碼
__author__ = ‘qindongliang’
#導入pymysql的包
import pymysql
try:
#獲取一個資料庫連接,注意如果是UTF-8類型的,需要制定資料庫
conn=pymysql.connect(host=’localhost’,user=’root’,passwd=’qin’,db=’person’,port=3306,charset=’utf8′)
cur=conn.cursor()#獲取一個游標
cur.execute(‘select * from person’)
data=cur.fetchall()
for d in data :
#注意int類型需要使用str函數轉義
print(“ID: “+str(d[0])+’ 名字: ‘+d[1]+” 性別: “+d[2])
cur.close()#關閉游標
conn.close()#釋放資料庫資源
except Exception :print(“發生異常”)
結果如下:
Java代碼
D:\python\python.exe D:/pythonide/pythonprojectworkspace/python/mysql.py
ID: 1 名字: 秦天 性別: 男
ID: 2 名字: 王晶 性別: 女
Process finished with exit code 0
原文
補充說明:
mysqldb作為python連接mysql資料庫的工具,但是mysqldb目前支撐的版本較低,安裝失敗。所以才嘗試pymysql,這個比較簡單易用
軟體下載地址:
python3.2.5:
pymysql3.0.5:
mysql:(為了方便安裝,我這裡選擇phpstudy)
1、python安裝目錄設定為d:/python32
2、pymysql安裝方法為:解壓下載的文件,在cmd中運行: python setup.py install。
檢驗安裝安裝是否成功的方法:import pymysql 。 如果不報錯 說明安裝成功。
3、mysql安裝目錄為D:/phpStudy/MySQL。為避免更多配置問題,可在啟動phpstudy後,將其設為系統服務
4、基本操作:
(1)導入pymysql: import pymysql
(2)連接資料庫: conn=pymysql.connect(host=’localhost’,user=’root’,passwd=’root’,db=’ere’,charset=’utf8′) 務必注意各等號前面的內容!charset參數可避免中文亂碼
(3)獲取操作游標:cur=conn.cursor()
(4)執行sql語句,插入記錄:sta=cur.execute(“insert 語句”) 執行成功後sta值為1。更新、刪除語句與此類似。
(5)執行sql語句,查詢記錄:cur.execute(“select語句”) 執行成功後cur變數中保存了查詢結果記錄集,然後再用循環列印結果:
for each in cur:
print(each[1].decode(‘utf-8’)) # each[1] 表示當前游標所在行的的第2列值,如果是中文則需要處理編碼
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/238674.html