Mysql似乎没有识别Python中的WHERE语句

时间:2018-03-27 14:39:25

标签: python mysql sql python-3.x

在创建处理数据库的新程序时遇到了问题。

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,它返回了正确的结果,但程序没有。

那为什么不起作用?我该怎么做才能让它发挥作用?

1 个答案:

答案 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以进行连接。