我是用的 pymysql 这个库,大体的代码逻辑如下:
...
做了一些事情,这些事情会导致数据库某个字段的值会改变
...
a=usermysql() # 自定义类的 __init__方法,pymysql.connect 和创建 cursor
while True:
a.execute()
result = a.fetchone()
if result == 'WORKING': # 执行语句,获取需要的字段的值,如果值变成了想要的,就退出循环,做接下来的任务
break
然而运行的时候,发现获取到的字段的值并不会变化,只有在 while 循环里初始化数据库的连接,才能获取到最新的数据库的值
请问这是为什么呢?
我创建的查询数据库的类是这样的
class MySQLQuery():
def __init__(self, ip, username, password, database):
'''
初始化 MySQL 数据库
'''
self.__sql = pymysql.connect(host=ip, user=username, password=password, db=database)
self.__cursor = self.__sql.cursor()
def selectOneResult(self, sentence):
'''
返回的结果是一个 tuple
如果不存在,返回结果是个 NoneType
'''
self.__cursor.execute(sentence)
result = self.__cursor.fetchone()
return result
初始化数据库连接是这样的
from lib.util.MySQLQuery import MySQLQuery
controllerDB = MySQLQuery(ip=MySQLIP, username=MySQLUserName, password=MySQLPassWord,
database='cloudplayer_controller_hometest')
使用这个的是另一个文件,使用的部分是这样的
from lib.util.GlobalVariable import controllerDB
def a():
# 做了一些事情...
while True:
sqlSentence = 'select instance_id from service where id = {selectid}'.format(selectid=selectID)
instanceID = controllerDB.selectOneResult(sqlSentence)[0]
newSqlSentence = 'select status from instance_status where instance_id = {instanceid}'.format(instanceid=instanceID)
status = controllerDB.selectOneResult(newSqlSentence)[0]
if status == 'WORKING':
break
time.sleep(3)
1
siteshen 2017-08-17 12:40:41 +08:00
数据库配置记录所有的查询,查看数据库 log 看请求有没有被数据库处理。
没有的话,查 execute 的文档,看是不是使用了类似执行过就不执行的机制。 |
2
albertofwb 2017-08-17 12:40:52 +08:00 via Android
仅仅从你 po 的这段 snippet 并不能看出问题,上源码链接吧
|
3
warcraft1236 OP @albertofwb 理论上,同一个语句,不同时候执行,返回的结果应该都是数据库里边最新的数据是吗?
|
4
QAPTEAWH 2017-08-17 12:59:18 +08:00
"MVCC"
开启 autocommit,或者每次查完 commit。 |
5
warcraft1236 OP @QAPTEAWH 能不能详细给讲一下呢?
|
6
sujin190 2017-08-17 13:24:16 +08:00
pymysql 默认的 autocommit 是 false,不 commit 是不能查询到新的数据的,你可以设置为 true 或者每次查询完 commit
|