python访问MySQL server,可以使用 _mysql模块, 也可使用进一步封装过的MySQLdb包。
若使用MySQLdb,则需要单独安装。
今天发现MySQLdb的API手册居然被墙了… …
我把这个手册下载并上传到自己的博客上,供需要的朋友参考。
MySQLdb包是遵循Python DB API 2.0规范开发的,它的用法可以参阅:
MySQLdb中常用的类有Connection(首字母大写)和Cursors
Connection类
该类的参考文档可参考:
通过关键字参数来构造Connection对象,举个例子:
import MySQLdb as mdb
try:
conn = mdb.Connection(host = '127.0.0.1', user = 'root', passwd = '******', db = 'test', charset='utf8')
except Exception, e:
print e
finally:
if vars().has_key('conn'):
conn.close
1
2
3
4
5
6
7
8
9
importMySQLdbasmdb
try:
conn=mdb.Connection(host='127.0.0.1',user='root',passwd='******',db='test',charset='utf8')
exceptException,e:
printe
finally:
ifvars().has_key('conn'):
conn.close
Connection类包括__enter__和__exit__方法,可以直接使用with语句,其实并不需要上述try/except/finally语句。
请看下面的例子:
import MySQLdb as mdb
conn = mdb.Connection(host = '127.0.0.1', user = 'root', passwd = '******', db = 'test', charset='utf8')
with conn:
print 'client:', conn.get_host_info()
1
2
3
4
5
importMySQLdbasmdb
conn=mdb.Connection(host='127.0.0.1',user='root',passwd='******',db='test',charset='utf8')
withconn:
print'client:',conn.get_host_info()
Connection对象可以进行SQL查询,但文档中也指出,这是非标准的做法,并不推荐使用的:
import MySQLdb as mdb
conn = mdb.Connection(host = '127.0.0.1', user = 'root', passwd = '******', db = 'test', charset='utf8')
with conn:
conn.query('select * from Books')
print conn.use_result().fetch_row(10) #max row number = 10
1
2
3
4
5
6
importMySQLdbasmdb
conn=mdb.Connection(host='127.0.0.1',user='root',passwd='******',db='test',charset='utf8')
withconn:
conn.query('select * from Books')
printconn.use_result().fetch_row(10)#max row number = 10
因为__enter__方法返回的是cursor对象,可以使用这个cursor对象进行SQL查询,举例查询Book表中的所有行:
import MySQLdb as mdb
conn = mdb.Connection(host = '127.0.0.1', user = 'root', passwd = '******', db = 'test', charset='utf8')
with conn as cursor:
cursor.execute('select * from Books')
for i in range(cursor.rowcount):
print cursor.fetchone()
1
2
3
4
5
6
7
importMySQLdbasmdb
conn=mdb.Connection(host='127.0.0.1',user='root',passwd='******',db='test',charset='utf8')
withconnascursor:
cursor.execute('select * from Books')
foriinrange(cursor.rowcount):
printcursor.fetchone()
另外,Connection对象的__enter__和__exit__之间,默认是一个事务(transaction),
只有当所有的SQL语句执行成功,才会commit,否则,会rollback
请看例子:
import MySQLdb as mdb
conn = mdb.Connection(host = '127.0.0.1', user = 'root', passwd = '******', db = 'test', charset='utf8')
with conn as cursor:
cursor.execute('INSERT INTO Books set Name = "%s"' % ('book1',))
cursor.execute('INSERT INTO Books set Name = %s' % ('book2',))
1
2
3
4
5
6
importMySQLdbasmdb
conn=mdb.Connection(host='127.0.0.1',user='root',passwd='******',db='test',charset='utf8')
withconnascursor:
cursor.execute('INSERT INTO Books set Name = "%s"'%('book1',))
cursor.execute('INSERT INTO Books set Name = %s'%('book2',))
上面,第一条插入语句是正确的,第二条插入语句有误,没有加引号。
最终的运行结果,是一条记录都没有插入。