在创建处理数据库的新程序时遇到了问题。
mysql游标似乎没有注意到以下函数中的WHERE语句:
def get_new_entries(self, delay):
start_time = t.time()
while True:
cursor = self.cnx.cursor()
check_delay = delay * 2
current_time = datetime.datetime.now() - datetime.timedelta(seconds=check_delay)
current_time = current_time.strftime("%Y-%m-%d %H:%M:%S")
data = current_time
print(current_time)
query = """SELECT FILE_NAME, CREATION_TIME FROM `added_files` WHERE CREATION_TIME < %s"""
cursor.execute(query, (data,))
print(query)
for (FILE_NAME, CREATION_TIME) in cursor:
print(FILE_NAME)
print(CREATION_TIME)
cursor.close()
cursor = None
print("###################")
t.sleep(delay - ((t.time() - start_time) % delay))
使用此功能,我希望每分钟功能都能检查过去一分钟内的新条目。最后,我希望它将文件名作为列表发送到另一个类,以便该类可以使用逻辑来处理文件名。
然而,WHERE CREATION_TIME&lt; '%s'似乎什么也没做。它要么不返回任何条目,而在mysql环境中尝试相同的查询本身应该做什么。然而,如果'&lt;'更改为“&gt;”它突然返回所有项目,即使那些不应该返回的项目。
话虽如此,我还只使用了这部分代码
cursor.execute(query)
当查询更改为
时 query = "SELECT FILE_NAME, CREATION_TIME FROM
{added_files {1}}。
这是第一次工作,但第二次在循环中它没有响应任何东西,即使我确实添加了数据库的东西。我使用了与浏览器中mysql环境中使用的程序相同的datetime,它返回了正确的结果,但程序没有。
那为什么不起作用?我该怎么做才能让它发挥作用?
答案 0 :(得分:1)
过了一会儿我解决了这个问题。它与我发送的代码无关,但与缺少autocommit = True
MYSQL连接有关。我会试着解释一下。
我的应用程序必须检查由另一个(C#)应用程序自动更新的数据库。对于每个新文件,C#app发现它在数据库中创建了一个新条目。同时,此Python应用程序每隔delay
检查一次新文件名(例如60.0秒)。
Python应用程序通过mysql.connector打开一个连接,似乎在那个时刻保持数据库的状态。您发布的任何代码都找不到添加到其中的任何内容,因为它不会在实际数据库中搜索,而是在其自己保存的数据库版本中进行搜索。
修复方法是将连接设置为autocommit。所以你会这样做:
self.cnx = mysql.connector.connect(user='root', password='', host='127.0.0.1', database='mydb')
self.cnx.autocommit = True
每次执行sql查询时,这将更新python应用程序中数据库的保存状态。
所以你没有得到你对python中sql查询的期望,请尝试将autocommit设置为true以进行连接。