安装

pip3 install pymysql


使用示例

  • 代码
import pymysql


class DB_handler:
    def __init__(self, db_ip, db_port, db_user, db_pwd, db_name):
        self.ip = db_ip
        self.port = db_port
        self.user = db_user
        self.pwd = db_pwd
        self.dbname = db_name
        self.connect()

    # 连接数据库
    def connect(self):
        self.db = pymysql.connect(user=self.user, password=self.pwd, host=self.ip, port=self.port, db=self.dbname)
        self.cur = self.db.cursor(cursor=pymysql.cursors.DictCursor)

    # 关闭连接
    def close(self):
        self.cur.close()
        self.db.close()

    # 查询
    def query(self, sql):
        try:
            self.cur.execute(sql)
            return self.cur.fetchall()
        except Exception as e:
            raise e

    # 更新
    def update(self, sql):
        # 增加/删除/修改数据
        # sql_del = 'delete from user where id = %d'  # 删除
        # sql_add = 'insert into user(id, username, password) values(4, "username", "password")'  # 增加
        # sql_update = 'update user set username = %s where id = %d'  # 修改
        try:
            self.cur.execute(sql)
            self.db.commit()
        except:
            self.db.rollback()


if __name__ == '__main__':
    # 实例化操作数据库的对象
    db_obj = DB_handler("192.168.248.79", 3366, "root", "xxx", "t")

    # 查询
    r = db_obj.query("select * from stu;")
    print(r)

    # 更新
    r = db_obj.update("update stu set name = 'Fam' where id = 1;")
    print(r)

    # 查询, 验证
    r = db_obj.query("select * from stu;")
    print(r)

    db_obj.close()
  • 效果

游标

创建

# 默认, 数据类型为 ((),()..)
cursor = conn.cursor()

# [{},{}..], list 中元素为 dict
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

# [(),()..], list 中元素为 tuple, SS(流式游标), 处理大量数据
# 流式游标, 不会将数据存在内存
# 但是未完成前, 该 conn 不能去处理其他 sql, 包括生成另一个 cur 也不行
# 超过 60s 会自动断开, 也可以修改 SET NET_WRITE_TIMEOUT 来增加超时间隔
cursor = conn.cursor(cursor=pymysql.cursors.SSCursor)

# [{},{}..], list 中元素为 dict
cursor = conn.cursor(cursor=pymysql.cursors.SSDictCursor)

取值

fetchone()
# 返回单个元祖, 即一条记录(row), 如果没有结果返回 None
# 重复多次可逐条取出

fetchall()
# 返回((), (), ()..), 即多条记录(rows), 如果没有结果返回 ()
# 通过索引取出

fetchmany(int)
# 返回 fetchall() 的前 int 条数的记录, int 不填默认为一条
# 起始查询为空, 则返回(), 最后的条目查询为空, 则只返回前边查询到的

# fetchmany 的示例, 一共只有 3 条记录
# 取 1 条
fetchmany(1) 
((1, 'Tom', datetime.datetime(2021, 6, 1, 13, 4, 34)),)

# 取 3 条, 此时第三条数据为空, 但不会返回((xxx,),(xxx,),()), 而是返回((xxx,),(xxx,))
fetchmany(3)
((2, 'Tim', datetime.datetime(2021, 6, 1, 17, 17, 53)), (3, 'Sam', datetime.datetime(2021, 6, 1, 17, 18)))

# 再取 2 条, 此时两条数据均为空, 但不会返回((),()), 而是返回()
fetchmany(2)
()

流式游标的使用

import pymysql

conn = pymysql.connect(user="root", password="xxx", host="192.168.248.79", port=3366, db="t")

# 创建流式游标
cur = conn.cursor(cursor=pymysql.cursors.SSDictCursor)

# 创建结果集
ret = []

# 执行 sql
cur.execute("select * from stu;")

# 流式游标只有和 fetchone()配合才有意义
r = cur.fetchone()

# 如果结果读取完毕, 此时 r 是 None, 就会退出循环
while r:
    ret.append(r)
    r = cur.fetchone()

# 输出结果
print(ret)