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 期間,數據庫端發生改變,也沒法和客戶端同步。
總結
以上是生活随笔為你收集整理的python pymysql cursors_python pymysql cursor的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 极氪二手车业务子品牌“极氪认证”上线,三
- 下一篇: 数据分析结果解读_聚类分析的实际运用及案