Python操作MySQL:pymysql模块

连接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()