Python中使用Mysql(编码实践)

时间:2022-10-09 15:58:45


文档 或者看源码

​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()。