Новые строки не отображаются после SQL INSERT и фиксации с помощью Python и SQL

Я создал цикл на Python, который вызывает сам себя для многократной проверки новых записей в базе данных. При первом выполнении все затронутые строки отображаются нормально. Тем временем я добавляю в базу данных больше строк. В следующем запросе в моем цикле новые строки не отображаются.

Это мой цикл запросов:

def loop():
    global mysqlconfig # username, passwd...
    tbd=[] # this is where I save the result
    conn = MySQLdb.connect(**mysqlconfig)
    conn.autocommit(True)
    c = conn.cursor()
    c.execute("SELECT id, message FROM tasks WHERE date <= '%s' AND done = 0;" % now.isoformat(' '))
    conn.commit()
    tbd = c.fetchall()      
    print tbd
    c.close()
    conn.close()

    time.sleep(5)
    loop()
loop()

Это часть SQL моего скрипта вставки Python:

conn = MySQLdb.connect(**mysqlconfig)
conn.autocommit(1)
c = conn.cursor()
c.execute("INSERT INTO tasks (date, message) VALUES ('{0}', '{1}');".format("2012-10-28 23:50", "test")) 
conn.commit()
id = c.lastrowid
c.close()
conn.close()

Я попробовал SQLite, я попробовал коннектор Oracle MySQL, я попробовал MySQLdb в системе Windows и Linux, и у всех была одна и та же проблема. Я просмотрел множество потоков в Stackoverflow, в которых рекомендовалось включить автофиксацию или использовать commit() после оператора SQL (например, один, два, три), которые я пробовал и не смог.

Когда я добавил данные с помощью HeidiSQL в свою базу данных, они появились в циклическом запросе, но я действительно не знаю, почему это так. Строки, вставленные с помощью mysql-client в Linux, и мой скрипт вставки Python никогда не отображаются, пока я не перезапущу циклический скрипт.

Я не знаю, дело ли в том, что я открываю 2 соединения, каждое в своем собственном скрипте, но я закрываю каждое соединение и каждый курсор, когда заканчиваю работу с ними.


person chrki    schedule 28.10.2012    source источник


Ответы (1)


Проблема может быть в вашей переменной now. Я не вижу нигде в цикле, что он сбрасывается.

Я бы, вероятно, использовал функцию mysql NOW():

c.execute("SELECT id, message FROM tasks WHERE date <= NOW() AND done = 0;")

Похоже, что время, которое вы вставляете в базу данных, находится в будущем. Я не думаю, что ваша проблема связана с подключением к базе данных, я думаю, что это как-то связано с вашими запросами.

person Nathan Villaescusa    schedule 28.10.2012
comment
Легко так сильно сосредоточиться на проблеме, что вы упустите очевидный ответ. Я делал это больше раз, чем я могу вспомнить. - person Nathan Villaescusa; 29.10.2012