python mysql library popular_【过时】MySQLdb:Python 操作 MySQL 数据库
NOTE(2017-11-18): MySQLdb 不支持 Python 3,而 Python 3 是主流,所以就沒(méi)有學(xué)習(xí)的必要了。
環(huán)境:MySQL 5.6.27, Ubuntu 15.10 64-bit
官方簡(jiǎn)介
MySQLdb is an thread-compatible interface to the popular MySQL
database server that provides the Python database API.
安裝
通過(guò) pip 安裝
$ apt-get install python-dev libmysqlclient-dev
$ pip install MySQL-python
通過(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' % row
Prepared 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ǔ)句使用的話,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,這樣至少代碼的行為更加明顯。
總結(jié)
以上是生活随笔為你收集整理的python mysql library popular_【过时】MySQLdb:Python 操作 MySQL 数据库的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 安心地板价格介绍怎么样
- 下一篇: django mysql connect