MySQLdb使用
Posted shadowcharle
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQLdb使用相关的知识,希望对你有一定的参考价值。
介绍:
mysqldb是python操作mysql数据库的一个库.mysql的几乎所有的操作都可以实现。
基本使用:
import MySQLdb conn = MySQLdb.connect(host=‘localhost‘,user=‘weiyz‘,passwd=‘123456‘,db=‘test_DB‘,charset=‘utf-8‘) #创建一个游标对象 cur = conn.cursor() #执行SQL语句,注意这里不返回结果,只是执行而已 cur.excute("use test_table;show tables;") #方法一:fetchall方法返回所有匹配的元组,给出一个大元组(每个元素还是一个元组) ress = cursor.fetchall() #方法二:fetchone方法返回一条数据,并且使游标右移,若没有返回None res = cursor.fetchone() while res: print res res = cursor.fetchone() db.close()
说明:
cursor的各个方法:
close(): 游标关闭方法,游标被关闭之后就不能再移动,更不能被fetch
fetchone/fetchall(): 获得一行/所有行结果
fetchmany([size]): size指出了我到底要获取多少行的数据,如果能够返回的行数小于要求的 行数的话,就以少的为准。
nextset(): 放弃所有结果集中结果直接跳到下个结果集(如果有的话)。如果没有更多结果集就返回None,否则返回True,接下来的fetch操作将会从新结果集返回数据了。所谓结果集,就是比如连着执行两条SQL语句的话,如果不调用nextset,那么fetch来fetch去总是只能得到第一个语句的结果内容,调用了这个之后就可以看到下一个语句执行结果的内容了。
rowcount: 这个属性代表了上一次execute*方法得到结果的结果行数,如果是-1则代表了上一次返回结果没有结果集且行数无法确定。
query: 中可以设置变量来动态地生成一些SQL语句,从而使操作更加灵活多变。query中的变量大多数时候用在查询操作里面,因为没有统一的格式规定,设定变量的方法有很多种形式。可以用格式化字符串,数字等等。例:"select Sno,Sname from Student where Sno=%s"
execute(query[,args]): query是一个SQL串,args是一个序列或者映射,将依次为query中的变量赋值。关于query串中的变量设置下面会细讲。这个方法返回的值是影响的行数(比如查询 SQL就返回查询到了多少行,增删SQL就返回增删了多少行)
executemany(query[,args]): 这个方法和execute是类似的,只不过它是重复好几次执行execute,args也是一个“相同长度序列的序列”,每一次执行都把一个序列中的项对应到query的变量中去。据说executemany在效率上比execute高出很多, 在批量插入、批量更新时可以考虑使用。注意,如果进行多次查询操作用这个方法的话只能得到最后一个参数约束到SQL中得到的结果集,所以executemany比较适合用于写而不是读操作。
关于execute和query的使用:
SQL = """ select * from Client where level > %d and gid = %s """ cur.execute(SQL,(2,‘10001‘)) #如果只有一个变量,args不要写类似 (‘10001‘)这样,因为这判是<type ‘str‘>而不是tuple,应该写(‘10001‘,) print cur.fetchone() ##如果同样的SQL,用executemany来查询多个结果集的话 cur.executemany(SQL,((2,‘10001‘),(2,‘10002‘),(1,‘10003‘),)) #如此就相当于依次把2,10001;2,10002和1,10003约束给SQL在执行,但是从查询数据的角度来看,只能得到10003的数据, #因为executemany是一口气执行完的,fetch只能fetch到最后一个数字。
扩展:
对于支持事务的数据库, 在Python数据库编程中,当游标建立之时,就自动开始了一个隐形的数据库事务:
commit()方法: 游标的所有更新操作
rollback()方法: 回滚当前游标的所有操作。
例:
SQL = "DELETE FROM Client WHERE level < %d" con = MySQLdb.connect(xxxxx) cur = con.cursor() try: cur.execute(SQL,(2,)) con.commit() except Exception,e: con.rollback() finally: cur.close() con.close()
以上是关于MySQLdb使用的主要内容,如果未能解决你的问题,请参考以下文章
使用 Python 的 MySQLdb 更新 MySQL 表的问题
无法在 App Engine 上捕获 MySQLdb.OperationalError