这里主要使用MySQLdb模块,可在https://pypi.python.org/pypi/MySQL-python/1.2.4进行下载并安装
下面是一个简单的例子,包括了一个mysql操作的常见步骤
import MySQLdb
try:
##建立一个数据库连接
conn = MySQLdb.connect(host='localhost', user='root', passwd='root', db='sa', port=3306, charset='utf8')
##打开一个游标,是数据库操作的入口
cur = conn.cursor()
##执行一个查询操作返回操作受影响的记录数
count = cur.execute('select * from user')
##查询所有
for data in cur.fetchall():
print "User[id=%s, code=%s, name=%s, pwd=%s, type=%s, status=%s]" % (data)
except MySQLdb.Error, e:
print "Mysql Error %d: %s" % (e.args[0], e.args[1])
finally:
##关闭游标和连接
if cur:
cur.close()
if conn:
conn.close()
这里对其中几个函数的使用做个说明
-
MySQLdb.connect(*args, **kwargs)
这个构造函数创建了一个数据库连接的实例,是进行后续操作的关闭。构造函数中提供了常用的参数如host,user,passwd,db,port,connect_timeout,charset,ssl
如上面例子所示表达的意思清晰明了 -
cursor
游标反应了与数据库操作的结果。通常是作为一个元组(tuple)。对数据库的操作都在游标上进行,如上面的执行、查询所有结果等。游标提供了一系列的方法来完成工作。下面是一些常用的方法 -execute(query, args=None)
执行一个查询,返回受影响的记录数。其中query是待执行的sql语句,args是query可能需要的参数,可以是序列或mapping -fetchone(),fetchmany(size=None),fetchall()
:这三个函数从游标中返回查询的结果,如果有值将以序列的方式返回 -scroll(value, mode='relative')
:设置游标的偏移量,可从相对和绝对位置设定。达到分页查询的效果def mysql_query_page(): try: conn = MySQLdb.connect(host='localhost', user='root', passwd='root', db='sa', port=3306, charset='utf8') cur = conn.cursor() count = cur.execute('select * from user') print "total count: %d " % (count) ##从第10条开始 cur.scroll(10) ##查询10条 data = cur.fetchmany(10) for u in data: print "User[id=%s, name=%s]" % (u) except MySQLdb.Error, e: conn.rollback() print "Mysql Error %d: %s" % (e.args[0], e.args[1]) finally: if cur: cur.close() if conn: conn.close()
以上查询结果集是元组,当然也支持字典的格式返回,提供了如下的api:
fetchoneDict(),fetchmanyDict(size=None),fetchallDict()
def mysql_query_dict_page(): try: conn = MySQLdb.connect(host='localhost', user='root', passwd='root', db='sa', port=3306, charset='utf8') cur = conn.cursor(MySQLdb.cursors.DictCursor) count = cur.execute('select * from user') print "total count: %d " % (count) cur.scroll(10) data = cur.fetchmanyDict(10) for u in data: print u except MySQLdb.Error, e: conn.rollback() print "Mysql Error %d: %s" % (e.args[0], e.args[1]) finally: if cur: cur.close() if conn: conn.close()
与上面的相比,这里需要注意两点:1、游标的实例化需要指定游标的
DictCursor
实例,2、查询使用上面说的api -
使用预编译的占位符(
Preparedstatements
)关于这个就不再多说,具体看下面的查询例子def mysql_insert(): try: conn = MySQLdb.connect(host='localhost', user='root', passwd='root', db='sa', port=3306, charset='utf8') cur = conn.cursor() for i in range(20): ##使用%s的通配占位 cur.execute('insert into user (name)values(%s)', ('name_' + str(i))) ##提交事务 conn.commit() except MySQLdb.Error, e: conn.rollback() print "Mysql Error %d: %s" % (e.args[0], e.args[1]) finally: if cur: cur.close() if conn: conn.close()
当然,针对这种批量的操作更好的方案可以是:
users = ('name_21', 'name_22', 'name_23',) cur.executemany('insert into user (name)values(%s)', users)
-
事务与关闭连接:上面在插入操作中我们用到了事务的提交与回滚
conn.commit() conn.rollback()
当然,任何时候不要忘记关闭连接
cur.close() conn.close()