Python学习 之 pymysql

安装

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值