python pymysql cursors_python pymysql cursor的问题

使用python操作mysql的时候一般都会使用如下语句:

官方示例

import pymysql.cursors

# 连接到数据库后实际上TCP的连接状态是ESTABLISHED

connection = pymysql.connect(host='localhost',

user='user',

password='passwd',

db='db',

charset='utf8mb4',

cursorclass=pymysql.cursors.DictCursor)

try:

with connection.cursor() as cursor:

sql = "INSERT INTO `users` (`email`, `password`) VALUES (%s, %s)"

cursor.execute(sql, ('webmaster@python.org', 'very-secret'))

#默认不自动提交事务,所以需要手动提交

connection.commit()

with connection.cursor() as cursor:

sql = "SELECT `id`, `password` FROM `users` WHERE `email`=%s"

cursor.execute(sql, ('webmaster@python.org',))

result = cursor.fetchone()

print(result)

finally:

connection.close()

在这段代码里,有一个疑惑的点是,我们现在创建了一个连接,但是实例化了多个cursor,我们可不可以使用同一个连接的同一个cursor来重复使用,代码如下

with connect.cursor() as cursor:

cursor.execute("select * from person limit 1")

print(id(cursor))

data = cursor.fetchone()

print(data)

print("=============")

cursor.execute("select * from person limit 1")

print(id(cursor))

data = cursor.fetchone()

print(data)

上面的代码,我们执行完了之后发现查询操作是可以直接使用的,并且不会产生冲突,我们通过打印cursor的地址发现是同一个cursor。

插入操作

with connect.cursor() as cursor:

for id in range(1, 100, 2):

cursor.execute("insert into test(id)values(%d)"%id)

print(id)

id += 1

cursor.execute("insert into test(id)values(%d)"%id)

time.sleep(2)

print(id)

在单进程单线程环境下依然没有问题

删除

with connect.cursor() as cursor:

for id in range(100):

# cursor.execute("insert into test(id)values(%d)" % id)

cursor.execute("delete from test where id=%s"%id)

time.sleep(5)

time.sleep(10)

也没有问题

但是有博客说多进程环境下会出现问题,我一直想重现,但是没有成功,等以后重现了再来更新。

但是

创建了一个 cursor 以后,建议完成一个事务就 commit 一下,不要一直用它,这样一直使用,并不会和数据库完成数据同步,如果操作太多,提交的时候会超时,造成部分数据更新,部分数据丢失,数据不一致且效率低。

并且握着 cursor 期间,数据库端发生改变,也没法和客户端同步。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值