文档 或者看源码
http://mysql-python.sourceforge.net/MySQLdb-1.2.2/public/MySQLdb-module.html
开篇
在上一篇Python中使用Mysql(安装篇)中,我们为Python安装了支持MySQL数据库的MySQLdb包,这篇中写的是我工作中最常用到的几种情形。
虽然也支持在Python中创建表,之类的操作。但在实际中很少是通过程序去创建一个数据库或一张表的。 这些工作一般都是由公司的DBA来完成。所以对于研发来说, 对数据库最常做的事情包括查询,插入行,和更新行。在实际工作中,删除一些行的行为也是不常用的,因为删除了就不容易回来,当不需要一些数据时,通常有一个代表 可用和不可用的字段,比如叫 enable。 当想删除一行时候,把这一行的enable置成0 来代替删除的动作。
情形一,查询一行
下面是一段查询代码小例子:
#!/usr/local/bin/python
# coding:utf-8
import MySQLdb
db_handle = MySQLdb.connect(host = '10.10.10.10', user = 'root', passwd = '123456', db = 'test',port = 3306, charset = 'utf8')
sql = "select * from test.user_info limit 1"
cur = db_handle.cursor( MySQLdb.cursors.DictCursor )
cur.execute( sql )
result = cur.fetchone()
cur.close()
db_handle.close()
print result['id']
请看这一句
cur = db_handle.cursor( MySQLdb.cursors.DictCursor )
它使得上面的result是一个字典的对象,可以直接用索引来访问对应的字段。
情形二,查询多行
查询多行和查询一行基本一样,就是 用的是 fetchall() 代替 fetchone()
#!/usr/local/bin/python
# coding:utf-8
import MySQLdb
db_handle = MySQLdb.connect(host = '10.10.0.10', user = 'root', passwd = '123456', db = 'test',port = 3306, charset = 'utf8')
sql = "select * from user_info limit 3"
cur = db_handle.cursor( MySQLdb.cursors.DictCursor )
cur.execute( sql )
result = cur.fetchall()
cur.close()
db_handle.close()
if not result :
for row in result:
print row['id']
查询时候,总有可能是查不到的,这时fetchone的返回值是 None, 但fetchall() 的返回值 是 () 空的元组,而不是None。 所以可以通过 下面这句判断是不足的。
<pre name="code" class="python"><strong>if result == None :</strong>
这句对 fetchone()是有效的,但是对于 fetchall()是无效的,
推荐使用
<strong>if not result :</strong>
这样对于 None 或者 空的元组() 都是有效的。
fetchall()的返回是一个元组,所以不能直接取对应字段,通常我是用一个循环,来处理每一行的数据。
情形三,插入或者更新一行
插入和更新与 查询有不同之处在于 这个动作修改了数据库中的内容。 所以少了查询后fetch结果的动作,而换成了commit 提交的动作。 示例代码:
#!/usr/local/bin/python
# coding:utf-8
import MySQLdb
db_handle = MySQLdb.connect(host = '10.10.10.10', user = 'root', passwd = '123456', db = 'test',port = 3306, charset = 'utf8')
sql = "insert into fruit values ('','apple','fruit','red')"
cur = db_handle.cursor( MySQLdb.cursors.DictCursor )
cur.execute( sql )
db_handle.commit()
cur.close()
db_handle.close()
更新也是差不多的句式,只是SQL语句从insert 换成了 update了 ,最后不要忘记了 commit()。