MySQLdb
import MySQLdb # 注意 这里需要额外导入, 不然会报module 'MySQLdb' has no attribute 'cursors'的错误 import MySQLdb.cursors as cors # 打开数据库连接 db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8', cursorclass=cors.DictCursor) # 使用cursor()方法获取操作游标 cursor = db.cursor() # SQL 插入语句 sql="insert into EMPLOYEE values(%s,%s,%s,%s)" try: # 执行sql语句 cursor.executemany(sql,[('Smith','Tom',15,'M',1500),('Mac', 'Mohan', 20, 'M', 2000)]) # 提交到数据库执行 db.commit() except: # Rollback in case there is any error db.rollback() # 关闭数据库连接 db.close()
插入多条数据
import MySQLdb # 注意 这里需要额外导入, 不然会报module 'MySQLdb' has no attribute 'cursors'的错误 import MySQLdb.cursors as cors # 打开数据库连接 db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8', cursorclass=cors.DictCursor) # 使用cursor()方法获取操作游标 cursor = db.cursor() # SQL 插入语句 sql="insert into EMPLOYEE values(%s,%s,%s,%s)" try: # 执行sql语句 cursor.executemany(sql,[('Smith','Tom',15,'M',1500),('Mac', 'Mohan', 20, 'M', 2000)]) # 提交到数据库执行 db.commit() except: # Rollback in case there is any error db.rollback() # 关闭数据库连接 db.close()
MySQLdb是一款较为底层的,python连接mysql用的模块。和更加高级的,提供ORM的模块不同,MySQLdb主要还是聚焦于如何和数据库进行连接和进行基本的操作,操作的体现形式主要还是进行SQL语句的执行。
pip install MySQL-python
import MySQLdb db = MySQLdb.connect(host='localhost',user='weiyz',passwd='123456',db='test_DB',charset='utf-8') cursor = db.cursor() #创建一个游标对象 cursor.excute("use test_table;show tables;") #执行SQL语句,注意这里不返回结果,只是执行而已 res = cursor.fetchall() #fetchall方法返回所有匹配的元组,给出一个大元组(每个元素还是一个元组) ####或者也可以这样#### res = cursor.fetchone() while res: print res res = cursor.fetchone() #fetchone只给出一条数据,然后游标后移。游标移动过最后一行数据后再fetch就得到Nonedb.close()
游标对象的执行和返回数据
就像上面例子中提到的那样,cursor可以调用execute来执行一定的SQL语句,也可以fetchone或者fetchall来得到返回的数据。接下来详细看一下cursor的各个方法:
callproc(procname[,args]) 调用一个叫做procname的存储过程
close() 游标也有关闭方法,游标被关闭之后就不能再移动,更不能被fetch
execute(query[,args]) query是一个SQL串,args是一个序列或者映射,将依次为query中的变量赋值。关于query串中的变量设置下面会细讲。这个方法返回的值是影响的行数(比如查询SQL就返回查询到了多少行,增删SQL就返回增删了多少行)
executemany(query[,args]) 这个方法和execute是类似的,只不过它是重复好几次执行execute,args也是一个“相同长度序列的序列”,每一次执行都把一个序列中的项对应到query的变量中去。据说executemany在效率上比execute高出很多, 在批量插入、批量更新时可以考虑使用。需要注意的是,这个方法是一个整体,如果想要进行多次查询操作用这个方法的话往往只能得到最后一个参数约束到SQL中得到的结果集。
fetchone/fetchall() 获得一行/所有行结果
fetchmany([size]) size指出了我到底要获取多少行的数据,如果能够返回的行数小于要求的行数的话,就以少的为准。
nextset() 放弃所有结果集中结果直接跳到下个结果集(如果有的话)。如果没有更多结果集就返回None,否则返回True,接下来的fetch操作将会从新结果集返回数据了。所谓结果集,就是比如连着执行两条SQL语句的话,如果不调用nextset,那么fetch来fetch去总是只能得到第一个语句的结果内容,调用了这个之后就可以看到下一个语句执行结果的内容了。
query中可以设置变量来动态地生成一些SQL语句,从而使得操作更加灵活多变。query中的变量大多数时候用在查询操作里面,因为没有统一的格式规定,设定变量的方法有很多种形式。比如可以用?,格式化字符串,数字等等。下面统一用格式化字符串的形式来表示。
比如"select Sno,Sname from Student where Sno=%s"
“select * from Client where level > %d and gid = %s"
SQL = """ select * from Client where level > %d and gid = %s """ cursor.execute(SQL,(2,'10001')) #需要注意的是,如果只有一个变量,args不要写类似('10001')这样,因为这判是<type 'str'>而不是tuple,应该写('10001',) print cursor.fetchone() ##如果同样的SQL,用executemany来查询多个结果集的话 cursor.executemany(SQL,(\ (2,'10001'),\ (2,'10002'),\ (1,'10003'),\ )\ ) #如此就相当于依次把2,10001;2,10002和1,10003约束给SQL在执行,但是从查询数据的角度来看,只能得到10003的数据,#因为executemany是一口气执行完的,fetch只能fetch到最后一个数字。所以executemany比较适合用于写而不是读操作。
因为MySQLdb是比较底层的模块,对数据库的操作都基于最基本的SQL语句,所以也就无所谓细讲如何增删查改了(反正到头来都是调用SQL),不过对于事务,还是有必要提及。
事务是通过接口对于数据库做出操作的最基本操作单位,可以看成是一系列操作的集合。一个事务具有以下特性:
原子性,事务中的所有操作要么都做要么都不做。
一致性,事务可以把数据库从一个一致性状态转变成另一个一致性状态
永久性,事务对数据库做出的改变是永久的。
隔离性,事务不应该被其他并行运行的事务所影响,事务间彼此应该是独立的
SQL = "DELETE FROM Client WHERE level < %d" db = MySQLdb.connect(xxxxx) cursor = db.cursor() try: cursor.execute(SQL,(2,)) db.commit() except Exception,e: db.rollback() finally: cursor.close() db.close()
pymysql
import pymysql # 打开数据库连接 db = pymsql.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8', "cursorclass"= pymysql.cursors.DictCursor) # 使用cursor()方法获取操作游标 cursor = db.cursor() # 执行完毕后返回的结果默认以元组显示 # 使用execute方法执行SQL语句 cursor.execute("SELECT VERSION()") # 使用 fetchone() 方法获取一条数据 data = cursor.fetchone() print "Database version : %s " % data # 关闭数据库连接 db.close()