Python mysql python

这里主要使用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()

这里对其中几个函数的使用做个说明

  1. MySQLdb.connect(*args, **kwargs) 这个构造函数创建了一个数据库连接的实例,是进行后续操作的关闭。构造函数中提供了常用的参数如 host,user,passwd,db,port,connect_timeout,charset,ssl如上面例子所示表达的意思清晰明了

  2. 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

  3. 使用预编译的占位符(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)
    
  4. 事务与关闭连接:上面在插入操作中我们用到了事务的提交与回滚

     conn.commit()
     conn.rollback()
    

    当然,任何时候不要忘记关闭连接

     cur.close()
     conn.close()
    


blog comments powered by Disqus