安装
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)