摘要:模塊提供的是類(lèi)似于接口的,而模塊在基礎(chǔ)上又做了進(jìn)一步封裝,使之符合的數(shù)據(jù)庫(kù)規(guī)范。的數(shù)據(jù)庫(kù)規(guī)范建議了種不同的方式來(lái)構(gòu)造,只支持其中的一種,代碼類(lèi)似于的格式化操作。提交修改,回滾。異常發(fā)生時(shí),調(diào)用進(jìn)行回滾。
NOTE(2017-11-18): MySQLdb 不支持 Python 3,而 Python 3 是主流,所以就沒(méi)有學(xué)習(xí)的必要了。
環(huán)境:MySQL 5.6.27, Ubuntu 15.10 64-bit
個(gè)人筆記,可讀性較差。尋教程請(qǐng)移步:MySQL Python tutorial
官方簡(jiǎn)介
安裝 通過(guò) pip 安裝MySQLdb is an thread-compatible interface to the popular MySQL
database server that provides the Python database API.
$ apt-get install python-dev libmysqlclient-dev $ pip install MySQL-python
詳見(jiàn):How to install Python MySQLdb module using pip?
通過(guò) apt 安裝$ sudo apt-get install python-mysqldb模塊 _mysql
MySQLdb 安裝好后,有兩個(gè)模塊或方式可用。模塊 _mysql 提供的是類(lèi)似于 MySQL C 接口的 API,而模塊 MySQLdb 在 _mysql 基礎(chǔ)上又做了進(jìn)一步封裝,使之符合 Python 的數(shù)據(jù)庫(kù) API 規(guī)范。推薦使用后者。
使用 _mysql 的例子:
import _mysql import sys try: con = _mysql.connect("localhost", "root", "******", "test") con.query("select version()") result = con.use_result() print "MySQL version: %s" % result.fetch_row()[0] except _mysql.Error, e: print "Error %d: %s" % (e.args[0], e.args[1]) sys.exit(1) finally: if con: con.close()
改用 MySQLdb:
import MySQLdb as mdb import sys try: con = mdb.connect("localhost", "root", "******", "test") cur = con.cursor() cur.execute("select version()") ver = cur.fetchone() print "MySQL version: %s" % ver except mdb.Error, e: print "Error %d: %s" % (e.args[0], e.args[1]) sys.exit(1) finally: if con: con.close()創(chuàng)建表,插入數(shù)據(jù)
# coding: utf-8 import MySQLdb as mdb con = mdb.connect("localhost", "root", "******", "test") with con: cur = con.cursor() cur.execute("drop table if exists writers") cur.execute("create table writers(id int primary key auto_increment, name varchar(25)) default charset utf8") cur.execute("insert into writers(name) values("Jack London")") cur.execute("insert into writers(name) values("Honore de Balzac")") cur.execute("insert into writers(name) values("Lion Feuchtwanger")") cur.execute("insert into writers(name) values("Emile Zola")") cur.execute("insert into writers(name) values("Truman Capote")") cur.execute("insert into writers(name) values("曹雪芹")")查詢(xún) 一次取回所有結(jié)果:fetchall
import MySQLdb as mdb con = mdb.connect("localhost", "root", "******", "test") with con: cur = con.cursor() cur.execute("select * from writers") # 結(jié)果集 rows 為元組(tuple)的元組,每一個(gè)元組代表了表中的一行。 rows = cur.fetchall() for row in rows: print row挨個(gè)取回結(jié)果:fetchone
import MySQLdb as mdb con = mdb.connect("localhost", "root", "******", "test") with con: cur = con.cursor() cur.execute("select * from writers") for i in range(cur.rowcount): row = cur.fetchone() print row使用字典 Cursor
import MySQLdb as mdb con = mdb.connect("localhost", "root", "******", "test") def test_dict_cursor(): with con: cur = con.cursor(mdb.cursors.DictCursor) # 字典 cursor cur.execute("select * from writers limit 4") # rows 為字典的元組 rows = cur.fetchall() for row in rows: print row["id"], row["name"] # 通過(guò)列名訪問(wèn)結(jié)果打印列名
import MySQLdb as mdb con = mdb.connect("localhost", "root", "******", "test") with con: cur = con.cursor() cur.execute("select * from writers limit 4") rows = cur.fetchall() # 元組的元組,每一個(gè)元組對(duì)應(yīng)一個(gè)結(jié)果列,元組的第一個(gè)元素為列名。 desc = cur.description # 打印前兩個(gè)結(jié)果列的列名。 print "%s %3s" % (desc[0][0], desc[1][0]) for row in rows: print "%2s %3s" % rowPrepared Statements
Prepared Statements 可以提高安全性和性能,特別是對(duì)于多次重復(fù)執(zhí)行的查詢(xún)。Python 的數(shù)據(jù)庫(kù) API 規(guī)范建議了 5 種不同的方式來(lái)構(gòu)造 Prepared Statements,MySQLdb 只支持其中的一種,代碼類(lèi)似于 ANSI printf 的格式化操作。
Prepared Statements 在 ORM 庫(kù)(比如 SQLAlchemy)中應(yīng)該會(huì)有更完善的支持。
注(2016-01-10):
這里的 Prepared Statements 只是客戶(hù)端的模擬,跟 MySQL Server 的 Prepared Statements 是兩碼事,所以并不能提高性能或安全性。(詳見(jiàn) C API Prepared Statements)
import MySQLdb as mdb con = mdb.connect("localhost", "root", "******", "test") with con: cur = con.cursor() cur.execute("update writers set name = %s where id = %s", ("Guy de Maupasant", "4")) print "Number of rows updated:", cur.rowcount事務(wù)
前面的例子一直使用 with 語(yǔ)句來(lái)管理鏈接 (connection) 對(duì)象,避免了 commit 的直接調(diào)用。
一旦 cursor 創(chuàng)建,一個(gè)事務(wù)也就開(kāi)始,結(jié)束時(shí)必須調(diào)用 commit 或 rollback。commit 提交修改,rollback 回滾。如果結(jié)合 with 語(yǔ)句使用的話(huà),commit 和 rollback 都將自動(dòng)完成,因?yàn)?MySQLdb 的鏈接對(duì)象可以當(dāng)作 context manager 使用。
# coding: utf-8 import MySQLdb as mdb try: con = mdb.connect("localhost", "root", "******", "test") # Cursor 創(chuàng)建,事務(wù)開(kāi)始。 cur = con.cursor() cur.execute("drop table if exists writers") # MyISAM doesn"t support transaction. cur.execute("create table writers(id int primary key auto_increment, name varchar(25)) engine=innodb") cur.execute("insert into writers(name) values("Jack London")") cur.execute("insert into writers(name) values("Honore de Balzac")") cur.execute("insert into writers(name) values("Lion Feuchtwanger")") cur.execute("insert into writers(name) values("Emile Zola")") cur.execute("insert into writers(name) values("Truman Capote")") # 顯式地調(diào)用 commit 來(lái)結(jié)束一個(gè)事務(wù)。 con.commit() except mdb.Error, e: # 異常發(fā)生時(shí),調(diào)用 rollback 進(jìn)行回滾。 if con: con.rollback() print "Error %d: %s" % (e.args[0], e.args[1]) sys.exit(1) finally: if con: con.close()Cursor 有必要 close 嗎?
原則上講,不需要顯式地調(diào)用 cursor 對(duì)象的 close 方法,因?yàn)楫?dāng) cursor 對(duì)象生命期結(jié)束時(shí),close 方法會(huì)被自動(dòng)調(diào)用。源碼如下:
class BaseCursor(object): def __del__(self): self.close() self.errorhandler = None self._result = None
不過(guò),還是建議主動(dòng)調(diào)用 close,這樣至少代碼的行為更加明顯。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/37667.html
摘要:用選擇要操作的數(shù)據(jù)庫(kù),然后通過(guò)指針就可以操作這個(gè)數(shù)據(jù)庫(kù)了。這樣就在這個(gè)數(shù)據(jù)庫(kù)中創(chuàng)建了一個(gè)名為的表這是查看表的方式。樹(shù)欲靜而風(fēng)不止,小偷在行動(dòng)。所以,要特別提醒諸位注意。 通過(guò)python操作數(shù)據(jù)庫(kù)的行為,除了能夠完成前面兩講中的操作之外(當(dāng)然,那是比較常用的),其實(shí)任何對(duì)數(shù)據(jù)庫(kù)進(jìn)行的操作,都能夠通過(guò)python-mysqldb來(lái)實(shí)現(xiàn)。 建立數(shù)據(jù)庫(kù) 在《用python操作數(shù)據(jù)庫(kù)(1)...
摘要:用來(lái)編寫(xiě)網(wǎng)站,必須要能夠通過(guò)操作數(shù)據(jù)庫(kù),所謂操作數(shù)據(jù)庫(kù),就是通過(guò)實(shí)現(xiàn)對(duì)數(shù)據(jù)的連接,以及對(duì)記錄字段的各種操作。交互模式下操作數(shù)據(jù)庫(kù)之連接數(shù)據(jù)庫(kù)操作數(shù)據(jù)庫(kù)的前提是先有數(shù)據(jù)庫(kù)。先建立一個(gè)數(shù)據(jù)庫(kù)。 用Python來(lái)編寫(xiě)網(wǎng)站,必須要能夠通過(guò)python操作數(shù)據(jù)庫(kù),所謂操作數(shù)據(jù)庫(kù),就是通過(guò)python實(shí)現(xiàn)對(duì)數(shù)據(jù)的連接,以及對(duì)記錄、字段的各種操作。上一講提到的那種操作方式,是看官直接通過(guò)交互模式來(lái)操...
摘要:為位的安裝原文在此基督尼瑪個(gè)耶穌這一切始于一個(gè)簡(jiǎn)單的想法我想裝然后寫(xiě)個(gè)網(wǎng)站并用這個(gè)機(jī)會(huì)多學(xué)點(diǎn)和的知識(shí)我理所當(dāng)然的選當(dāng)數(shù)據(jù)庫(kù)因?yàn)樵谖壹依锏哪桥_(tái)電腦上裝著之前的一個(gè)項(xiàng)目里用到的服務(wù)我從沒(méi)想到因?yàn)檫x擇讓我接下來(lái)的幾個(gè)夜晚都因?yàn)樘幚淼膯?wèn)題而過(guò)的 Install 64-bit MySQLdb for Python 3 on Windows 7 為64位Windows7的Pyhton3安裝MySQ...
閱讀 3286·2021-09-30 09:47
閱讀 2302·2021-09-10 10:51
閱讀 1906·2021-09-08 09:36
閱讀 2935·2019-08-30 12:56
閱讀 3042·2019-08-30 11:16
閱讀 2632·2019-08-29 16:40
閱讀 3001·2019-08-29 15:25
閱讀 1640·2019-08-29 11:02