2.執行sql語句並接收返回值。
3.關閉數據庫連接
1,MySQL數據庫中使用了MySQLdb模塊,但是Python用來鏈接MySQL的第三方庫MySQLdb不支持Python3.x
特別說明:我在電腦上做實驗的時候,我的python是2.7.2版本。安裝相應版本的Mysqldb後,就可以直接運行並成功連接數據庫,所以如果大家都和我壹樣流暢的話,下面就不用看了,直接跳過來看第2點的SQL語句如何執行!如果安裝後出現異常,可以參考以下解決方法。
連接的關鍵是安裝MySQLdb模塊,下載Python對應的版本:
下載安裝後會自動檢測電腦Python的安裝路徑,自動填充模塊解壓路徑(我的是:d:\ program files \ active Python 2 . 6 . 6 . 17 \ lib \ site-packages \)。
但解壓後無法使用,MySQLdb模塊下的部分文件需要修改:
①.查找__init__。MySQLdb目錄中的py(我的是:d:\ program files \ active python 2 . 6 . 6 . 17 \ lib \ site-packages \ MySQLdb):
來自setsimport ImmutableSet和DBAPISet(ImmutableSet)類:在註釋的第34行和第35行,在它們後面添加DBAPISet(frozenset)類:
#從集合導入不可變集合
# class DBAPISet(ImmutableSet):
DBAPISet類(frozenset):
②.打開轉換器. py:
註意從Sets導入BaseSet,第37行Set,把第45行return set ([I for I in s split(',')ifi])中的Set改為Set;同樣,將129行Set: Set2Str中的Set改為Set(不要修改Set2Str),修改到此結束。
2.建立數據庫連接
導入MySQLdb
conn = mysqldb . connect(host = " localhost ",user="root ",passwd="sa ",db="mytable ")
更常用的參數包括
Host:連接的數據庫服務器的主機名;默認值為localhost。
用戶:數據庫登錄名。默認為當前用戶。
Passwd:數據庫登錄的秘密。默認情況下,它是空的。
Db:要使用的數據庫名稱。沒有默認值。
端口:MySQL服務使用的TCP端口。默認值為3306。
Conn連接有兩個重要的方法:提交添加和修改,回滾以取消添加或修改。
3.執行數據庫操作
n =遊標. execute(sql,param)
我們將通過連接對象得到壹個cursor對象,然後我們將使用cursor提供的方法來工作。
這些方法包括兩類:1。執行命令和2。接收返回值。
遊標執行命令的方法:
Callproc(self,procname,args):用於執行存儲過程。收到的參數是存儲過程名稱和參數列表,返回值是受影響的行數。
Execute(self,query,args):執行壹條sql語句。收到的參數是sql語句本身和使用的參數列表,返回值是受影響的行數。
Executemany(self,query,args):執行壹對壹的sql語句,但是重復執行參數表中的參數,返回值是受影響的行數。
Nextset(self):移動到下壹個結果集。
遊標用來接收返回值的方法:
Fetchall(self):接收所有返回的結果行。
Fetchmany(self,size=None):接收size以返回結果行。如果size的值大於返回的結果行數,將返回cursor.arraysize數據。
Fetchone(self):返回壹個結果行。
Scroll (self,value,mode='relative '):將指針移動到某壹行。如果mode =' relative ',則意味著從當前行移動值條;如果mode='absolute ',則意味著從結果集的第壹行開始移動值欄。
下面的代碼是壹個完整的例子。
#使用sql語句,此處接收的所有參數都使用%s占位符。請註意,無論您要插入什麽類型的數據,占位符總是使用% s。
sql= "插入到cdinfo值(%s,%s,%s,%s,%s)"
#param應該是元組或列表。
param=(標題,歌手,imgurl,url,alpha)
#執行,如果成功,n的值是1。
n =遊標. execute(sql,param)
#再次執行查詢操作。
cursor . execute(" select * from cdinfo ")
#我們使用fetchall的方法。這樣,查詢返回的所有結果都將存儲在cds中。每個結果都是壹個元組類型的數據,這些元組形成壹個元組。
cds=cursor.fetchall()
#因為是元組,所以可以這樣使用結果集。
打印光盤[0][3]
#或者直接顯示出來,看看結果集到底是什麽樣子。
打印CD
#如果需要批量插入數據,請這樣做。
sql="insert into cdinfo值(0,%s,%s,%s,%s,%s)"
#每個值的集合是壹個元組,整個參數集構成壹個元組,或者說壹個列表。
param=((title,singer,imgurl,url,alpha),(title2,singer2,imgurl2,url2,alpha2))
#使用executemany方法批量插入數據。這真是壹個很酷的方法!
n=cursor.executemany(sql,param)
需要註意的是(或者我覺得奇怪)在插入、刪除或者修改之後,需要調用conn.commit()方法提交。這樣,數據才會真正保存在數據庫中。不知道是不是我的mysql設置問題。簡而言之,當我今天開始使用它時,如果我不使用commit,數據不會保留在數據庫中,但它確實保留在數據庫中。
4.關閉數據庫連接
您需要分別關閉指針對象和連接對象。他們有相同的名字。
cursor.close()
conn.close()
5、
5編碼(防止亂碼)
註意事項:
1 Python文件設置編碼為utf-8(文件前面有#encoding=utf-8)。
2 MySQL數據庫charset=utf-8
3 Python用參數charset=utf8連接MySQL。
4將Python的默認編碼設置為UTF-8(sys . setdefaultencoding(UTF-8))。
#編碼=utf-8
導入系統
導入MySQLdb
重新加載(系統)
sys.setdefaultencoding('utf-8 ')
db=MySQLdb.connect(user='root ',charset='utf8 ')
註意:MySQL的配置文件設置也必須配置為utf8。
6.模塊功能演示
#!/usr/bin/python
導入MySQLdb
con = mysqldb . connect(host = ' localhost ',user='root ',passwd='root ',db='abc ')
遊標=con.cursor()
sql ="select * from myt "
遊標. execute(sql)
row=cursor.fetchone()
打印行
cursor.close()
con.close()
執行以下SQL語句以獲取返回值:
//獲取連接的光標
cursor=conn.cursor()
//查詢
sql = "select * from table "
//添加
Sql = "插入表(字段,字段)值(值) "
//修改
Sql = "更新表集字段= '值' where條件"
//刪除
Sql = "從表中刪除where條件"
遊標. execute(sql)
返回值
cur.execute('select * from tables ')
返回值是SQL語句獲得的行數,比如2L,表示2行。
然後,可以從對象的fetchone或fetchall方法中獲取行信息。
獲取行信息
指針對象的fetchone()方法是壹次獲取壹行的元組返回值:
引用
& gt& gt& gtrow=cur.fetchone()
& gt& gt& gt打印行
(' user1 ',' 52c 69 E3 a 57331081823331 C4 e 69 d3f 2 e ',1000L,1000L,'/home/FTP/user1 ','')
指針對象的Fetchall()方法可以取出指針結果集中的所有行,返回的結果集是壹個元組:
引用
& gt& gt& gtcur.scroll(0,'絕對')
& gt& gt& gtrow=cur.fetchall()
& gt& gt& gt打印行
((' user1 ',' 52c 69 E3 a 57331081823331 C4 e69 d3f 2 e ',1000L,1000L,'/home/FTP/user1 ',''),(' user2 ',' 7 e58d 63 b 60197 CEB 55 a 65448
移動指針
當使用fetchone()方法時,指針會移動。因此,如果指針沒有復位,使用fetchall的信息將只包含指針後面的行內容。
使用以下方式手動移動指針:
cur.scroll(int,parm)
意思是:
引用
Int:移動的行數,整數;在相對模式中,正數向下移動,負數向上移動。
Parm:運動的方式;默認是相對的,相對模式;絕對模式是可以接受的。
更新數據
修改數據,包括插入、更新和刪除。它們都是使用指針對象的execute()方法執行的:
cur . execute(" insert into table(row 1,row2)值(' 111 ',' 222 ')")
cur . execute(" update table set row 1 = ' test ' where row 2 = ' row 2 ' ")
cur . execute(" delete from table where row 1 = ' row 1 ' ")
因為單引號“”用於SQL語句中的標識,所以python中的字符串需要用雙引號括起來。
此外,還可以使用python的“格式字符串”編寫方法來簡化命令,比如:
cur . execute(" update table set row 1 = ' % s ',其中row 2 = ' % s ' "(' value 1 ',' value2 '))
※請註意,' %s '的單引號是SQL語句的間隔符,' value1 '的單引號是python的字符串間隔符,兩者含義不同。是否需要間隔符,用雙引號還是單引號做間隔符,要看它的意思。例如,有:
cur . execute(" update FTPUSERS set passwd = % s,其中userid = ' % s ' "(" MD5(' 123 ')",' user2 '))
這裏paswd=%s是因為SQL的md5()函數不需要單引號區間;“md5('123 ')”是帶單引號的python字符串,所以用雙引號括起來。
提交更改
正常情況下,MySQLdb模塊會自動提交修改。但是在我們更新數據之後,我們手動運行壹次:
conn.commit()
關閉數據庫連接
您需要分別關閉指針對象和連接對象。他們有相同的名字。
cursor.close()
conn.close()