连接MySQL有两个模块:mysqldb和pymysql,第一个在Python3.x上不能用,所以我们学pymysql
import pymysql # 创建连接,事务自动提交 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='mysql8', db='mysqltest',autocommit=True) # 创建游标(遍历结果集的指针) cursor = conn.cursor() # 执行SQL,返回影响行数 effect_rows = cursor.execute("select * from tt") print(effect_rows) # 返回结果集的总行数 rows = cursor.rowcount # 取前两条 print(cursor.fetchmany(2)) # 重置游标的位置到第一行 cursor.rownum=0 # 取第一条 print(cursor.fetchone()) # 取所有 print(cursor.fetchall()) # 用批量插入语句插入data data = [(7,'gg'),(8,'hh'),(9,'ii')] cursor.executemany("insert into tt values(%s, %s)", data) cursor.close() conn.close()
游标的意义:
先看一个例子,我先用游标执行一个查询SQL,总共返回三条数据,接着执行cursor.fetchone(),再执行cursor.fetchall()。结果是fetchone得到第一条数据,fetchall得到后两条数据。
可以看出,游标类似于指针。fetchone之后,指针会自动向后移动。可以重置游标的位置,用cursor.rownum=数字可以重置游标到任意位置。
这样设计有什么意义??类似于迭代器,跟迭代器不同的是,迭代器需要从第一个依次取,游标可以移动到中间任意地方开始取。
事务的操作:
import pymysql import pymysql conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='mysql8', db='mysqltest', autocommit=False) cursor = conn.cursor() try: # 执行一个事务,包括多条更新语句 cursor.execute("select * from tt") cursor.execute("insert into tt values(1, 'a')") cursor.execute("update tt set a='b'") # 提交事务 conn.commit() except Exception as e: # 执行失败,事务回滚 conn.rollback() finally: if cursor: cursor.close() if conn: conn.close()