摘要:模塊提供的是類似于接口的,而模塊在基礎上又做了進一步封裝,使之符合的數(shù)據(jù)庫規(guī)范。的數(shù)據(jù)庫規(guī)范建議了種不同的方式來構造,只支持其中的一種,代碼類似于的格式化操作。提交修改,回滾。異常發(fā)生時,調用進行回滾。
NOTE(2017-11-18): MySQLdb 不支持 Python 3,而 Python 3 是主流,所以就沒有學習的必要了。
環(huán)境:MySQL 5.6.27, Ubuntu 15.10 64-bit
個人筆記,可讀性較差。尋教程請移步:MySQL Python tutorial
官方簡介
安裝 通過 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
詳見:How to install Python MySQLdb module using pip?
通過 apt 安裝$ sudo apt-get install python-mysqldb模塊 _mysql
MySQLdb 安裝好后,有兩個模塊或方式可用。模塊 _mysql 提供的是類似于 MySQL C 接口的 API,而模塊 MySQLdb 在 _mysql 基礎上又做了進一步封裝,使之符合 Python 的數(shù)據(jù)庫 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("曹雪芹")")查詢 一次取回所有結果:fetchall
import MySQLdb as mdb con = mdb.connect("localhost", "root", "******", "test") with con: cur = con.cursor() cur.execute("select * from writers") # 結果集 rows 為元組(tuple)的元組,每一個元組代表了表中的一行。 rows = cur.fetchall() for row in rows: print row挨個取回結果: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"] # 通過列名訪問結果打印列名
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() # 元組的元組,每一個元組對應一個結果列,元組的第一個元素為列名。 desc = cur.description # 打印前兩個結果列的列名。 print "%s %3s" % (desc[0][0], desc[1][0]) for row in rows: print "%2s %3s" % rowPrepared Statements
Prepared Statements 可以提高安全性和性能,特別是對于多次重復執(zhí)行的查詢。Python 的數(shù)據(jù)庫 API 規(guī)范建議了 5 種不同的方式來構造 Prepared Statements,MySQLdb 只支持其中的一種,代碼類似于 ANSI printf 的格式化操作。
Prepared Statements 在 ORM 庫(比如 SQLAlchemy)中應該會有更完善的支持。
注(2016-01-10):
這里的 Prepared Statements 只是客戶端的模擬,跟 MySQL Server 的 Prepared Statements 是兩碼事,所以并不能提高性能或安全性。(詳見 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事務
前面的例子一直使用 with 語句來管理鏈接 (connection) 對象,避免了 commit 的直接調用。
一旦 cursor 創(chuàng)建,一個事務也就開始,結束時必須調用 commit 或 rollback。commit 提交修改,rollback 回滾。如果結合 with 語句使用的話,commit 和 rollback 都將自動完成,因為 MySQLdb 的鏈接對象可以當作 context manager 使用。
# coding: utf-8 import MySQLdb as mdb try: con = mdb.connect("localhost", "root", "******", "test") # Cursor 創(chuàng)建,事務開始。 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")") # 顯式地調用 commit 來結束一個事務。 con.commit() except mdb.Error, e: # 異常發(fā)生時,調用 rollback 進行回滾。 if con: con.rollback() print "Error %d: %s" % (e.args[0], e.args[1]) sys.exit(1) finally: if con: con.close()Cursor 有必要 close 嗎?
原則上講,不需要顯式地調用 cursor 對象的 close 方法,因為當 cursor 對象生命期結束時,close 方法會被自動調用。源碼如下:
class BaseCursor(object): def __del__(self): self.close() self.errorhandler = None self._result = None
不過,還是建議主動調用 close,這樣至少代碼的行為更加明顯。
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37667.html
摘要:用選擇要操作的數(shù)據(jù)庫,然后通過指針就可以操作這個數(shù)據(jù)庫了。這樣就在這個數(shù)據(jù)庫中創(chuàng)建了一個名為的表這是查看表的方式。樹欲靜而風不止,小偷在行動。所以,要特別提醒諸位注意。 通過python操作數(shù)據(jù)庫的行為,除了能夠完成前面兩講中的操作之外(當然,那是比較常用的),其實任何對數(shù)據(jù)庫進行的操作,都能夠通過python-mysqldb來實現(xiàn)。 建立數(shù)據(jù)庫 在《用python操作數(shù)據(jù)庫(1)...
摘要:用來編寫網(wǎng)站,必須要能夠通過操作數(shù)據(jù)庫,所謂操作數(shù)據(jù)庫,就是通過實現(xiàn)對數(shù)據(jù)的連接,以及對記錄字段的各種操作。交互模式下操作數(shù)據(jù)庫之連接數(shù)據(jù)庫操作數(shù)據(jù)庫的前提是先有數(shù)據(jù)庫。先建立一個數(shù)據(jù)庫。 用Python來編寫網(wǎng)站,必須要能夠通過python操作數(shù)據(jù)庫,所謂操作數(shù)據(jù)庫,就是通過python實現(xiàn)對數(shù)據(jù)的連接,以及對記錄、字段的各種操作。上一講提到的那種操作方式,是看官直接通過交互模式來操...
摘要:為位的安裝原文在此基督尼瑪個耶穌這一切始于一個簡單的想法我想裝然后寫個網(wǎng)站并用這個機會多學點和的知識我理所當然的選當數(shù)據(jù)庫因為在我家里的那臺電腦上裝著之前的一個項目里用到的服務我從沒想到因為選擇讓我接下來的幾個夜晚都因為處理的問題而過的 Install 64-bit MySQLdb for Python 3 on Windows 7 為64位Windows7的Pyhton3安裝MySQ...
閱讀 3274·2021-09-30 09:47
閱讀 2290·2021-09-10 10:51
閱讀 1889·2021-09-08 09:36
閱讀 2926·2019-08-30 12:56
閱讀 3027·2019-08-30 11:16
閱讀 2622·2019-08-29 16:40
閱讀 2994·2019-08-29 15:25
閱讀 1632·2019-08-29 11:02