3

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()

これは私のPython挿入スクリプトのSQL部分です:

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のコネクタを試し、WindowsおよびLinuxシステムでMySQLdbを試しましたが、すべて同じ問題が発生しました。私は、 SQLステートメント(例: 1、2、3 )の後に自動コミットをオンにするかcommit()を使用することを推奨する、Stackoverflowの多くのスレッドを調べましたが、試行して失敗しました。

HeidiSQLを使用してデータベースにデータを追加すると、ループクエリに表示されましたが、これがなぜであるかはよくわかりません。Linuxでmysql-clientを使用して挿入された行と、Python挿入スクリプトは、ループスクリプトを再起動するまで表示されません。

それぞれ独自のスクリプトで2つの接続を開いたのかどうかはわかりませんが、接続が完了したら、すべての接続とすべてのカーソルを閉じます。

4

1 に答える 1

1

問題は変数にある可能性がありますnow。ループのどこにもリセットされているのがわかりません。

私はおそらくmysqlNOW()関数を使用します:

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

データベースに挿入しているのは将来の時間のようです。あなたの問題はデータベース接続にあるとは思いません。それはあなたが行っているクエリに関係していると思います。

于 2012-10-28T23:45:19.983 に答える