python读写mysql总结
一、MySQLdb包的安裝
1. 在win環境下,下載MySQL-python-1.2.3,有兩種方式:
(1) 下載src源碼.tar.gz(這個源碼需要build編譯再安裝.egg包(當于.jar包));
不過這種方法之后需要修改環境變量和MySQLdb.conf文件夾里的配置文件等等,具體網上去搜對應版本,我用的第二種方法,在python命令行里直接import MySQLdb;沒有出現任何問題。
(2) 直接下載MySQL-python-1.2.3.exe安裝包(雙擊直接安裝);
這里直接安裝的.exe,在python命令行里import沒問題,在PyCharm里import沒問題,但在pydev里引入就提示”uncheck package”,估計是pydev這個插件本身就有一些不完善的功能,要不就是最容易忽略的錯誤:忘記設置環境變量或者環境變量設置的路徑錯誤。
2. 解決eclipse里pydev插件不能引入MySQLdb包的問題:強制編譯,而不僅是要在構建路徑里引入庫文件、.egg包(當于.jar包)等
解決方案:
Eclipse中,windows==>preference==>Pydev中,配置Interpreter-Python的ForcedBuiltins選項卡內容,手動添加內容MySQLdb,將模塊強制編譯進去。
如果僅操作"構建路徑System PYTHONPATH"的內容,引入庫文件,無論如何不會解決問題。一定要強制編譯進去!!!
?
二、連接數據庫
python連接mysql主要用到了游標cursor來訪問,這個是MySQLdb自帶的。
補充幾個對象的方法和屬性:
1.connection的參數:conn=MySQLdb.connect(“localhost”, “root”, “123456”, “testdb”)
??????????????? ?亦作conn = MySQLdb.connect(host=’localhost’,user=’root’, passwd=’123456’, db=’testdb’)
注意這里沒有寫明端口號port=3306,是因為MySQLdb默認端口號為3306,不用指定,如果你自己改了,就要寫上。
connection的參數:
- host,連接的數據庫服務器主機名,默認為本地主機(localhost)。
- user,連接數據庫的用戶名,默認為當前用戶。
- passwd,連接密碼,沒有默認值。
- db,連接的數據庫名,沒有默認值。
- port,指定數據庫服務器的連接端口,默認是3306
- conv,將文字映射到Python類型的字典。默認為MySQLdb.converters.conversions
- cursorclass,cursor()使用的種類,默認值為MySQLdb.cursors.Cursor。
- compress,啟用協議壓縮功能。
- named_pipe,在windows中,與一個命名管道相連接。
- init_command,一旦連接建立,就為數據庫服務器指定一條語句來運行。
- read_default_file,使用指定的MySQL配置文件。
- read_default_group,讀取的默認組。
- unix_socket,在unix中,連接使用的套接字,默認使用TCP。
?
2.connection(連接)對象
?方法名?????????????????????作用
conn.?close()??????????????????關閉數據庫
conn.commit()????????????????提交當前事務
----- 必須sql寫完后要提交commit(),尤其是insert, update, delete時,否則數據庫沒有變化!!!?
----- 而像select這種普通的查詢,不涉及修改數據庫的,是否commit()沒有關系
conn.rollback()??????????????取消當前事務
?? ---- 異常處理except Exception:里最好還是加上回滾rollback()
conn.cursor()???????????獲取當前連接的游標對象
conn.rrorhandler(cxn,cur,errcls,errval)??作為已給游標的句柄
?
3.cursor游標對象屬性及方法
(1) cursor執行命令的方法
callproc(sql, procname, args)????執行存儲過程,接收參數為存儲過程名和參數列表,返回值為受影響的行數
execute(sql,param, args)?????執行單條sql語句,接收參數param,返回值為args受影響的行數
executemany(sql,param, args) ?執行多條sql語句,接收參數param,返回值為args受影響的行數
next()????????????使用迭代對象得到結果的下一行
nextset() / nestset(self):????移動到下一個結果集(如果支持的話)
close()???????????關閉游標
connection???????創建此游標的連接(可選)
(2) cursor用來接收返回值的方法
fetchone()????????返回一條結果行
fetchall(self)????????匹配所有剩余結果
fetchmany(size-cursor,arraysize)??匹配結果的下幾行
rowcount?????????讀取數據庫表中的行數,最后一次execute()返回或影響的行數
scroll(self, value, mode=’relative’):移動指針到某一行。如果mode=’relative’,則表示從當前所在行移動value條,如果mode=’absolute’,則表示從結果集的第一行移動value條
arraysize????????使用fetchmany()方法時一次取出的記錄數,默認為1
discription??????返回游標的活動狀態,包括(7元素):
(name,type_code,display_size,internal_size,precision,scale,null_ok)其中name, type_code是必須的。
lastrowid????????返回最后更新行的ID(可選),如果數據庫不支持,返回None
__iter__()????????創建迭代對象(可選,參考next())
messages??????????游標執行好數據庫返回的信息列表(元組集合)
rownumber?????????當前結果集中游標的索引(從0行開始)
setinput-size(sizes)???設置輸入最大值
setoutput-size(sizes[,col])??設置列輸出的緩沖值
?
三、代碼
(1) mysql_1.py
import MySQLdbtry:conn = MySQLdb.connect(host='localhost', user='root', passwd='mysql', db='testdb') # 默認port可以不寫3306cursor = conn.cursor()sql = "insert into table1 values('105', 'tomy', 23, 'm', 'U.KK.')"cursor.execute(sql)conn.commit() #提交事務commit()cursor.execute("select * from table1")results = cursor.fetchall()for re in results:print recursor.close()conn.close() except MySQLdb.Error, e:conn.rollback() #回滾rollback()print "MySQL Error %d: %s" % (e.args[0], e.args[1]) print e(2) mysql_2.py # -*-encoding: utf-8 -*- import os import string import sys import MySQLdb# 連接數據庫 try: conn = MySQLdb.connect(host='localhost',port=3306, user='root', passwd='mysql', db='testdb') except Exception, e:print esys.exit()# 獲取cursor游標對象來進行操作 cursor = conn.cursor()# 創建表 sql = "create table if not exists test1(name varchar(128) primary key, age int(4))" cursor.execute(sql) print "success create table test1!"# 插入數據 sql = "insert into test1(name, age) values('%s', '%d')" % ("denny", 23) try:cursor.execute(sql)conn.commit() #凡是insert,update,delete都要"提交事務commit()",否則數據庫不會改變print "succeess insert a record!" except Exception, e:conn.rollback() #異常必須回滾rollback()print e # 插入多條數據 sql = "insert into test1(name, age) values (%s, %s)" param = (("tom", 24), ("alice", 25), ("bob", "26")) try:cursor.executemany(sql, param) #批量插入數據時必須用.executemany(sql)而不是.execute(sql),那是單條數據conn.commit()print "success insert many records!" except Exception, e:conn.rollback()print e# 查詢出數據 sql = "select * from test1" cursor.execute(sql) alldata = cursor.fetchall() # 如果有數據返回就循環輸出,alldata是個二維列表) if alldata:for rec in alldata:print rec[0], rec[1] # 分別輸出,結果為denny 23# print rec # 也可以直接輸出rec,不帶下標rec[i], 結果為('denny', 23L)# 關閉連接 cursor.close() conn.close()
控制臺輸出結果:
SQL表結果:
(3) mysql_3.py (fetchone()示例)
import MySQLdbdb = MySQLdb.connect("localhost", "root", "mysql", "testdb" ) cursor = db.cursor() cursor.execute("select * from test1") data = cursor.fetchone() while data!=None:print data[1]data = cursor.fetchone() db.close(4) mysql_4.py(fetchall()示例) import MySQLdbdb = MySQLdb.connect("localhost", "root", "mysql", "testdb" ) cursor = db.cursor() cursor.execute("select * from test1") datas = cursor.fetchall() for data in datas:print data[1] print cursor.rowcount,"rows in tatal" db.close
轉載于:https://www.cnblogs.com/DianaCody/p/5425665.html
總結
以上是生活随笔為你收集整理的python读写mysql总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 转:在MyEclipse下创建Java
- 下一篇: mysql里制造一个错误