4

データ アクセスに SQLAlchemy を使用して Python で記述された Web アプリケーションがあります。挿入の最後の挿入 ID を取得しようとしています。このコードは、私が PyODBC を使用していたときには機能していましたが、SQLAlchemy では機能しないようです。 LAST_INSERT_ID()一貫して1つずれているIDを返すようです。

    query = text("""INSERT INTO HR_PunchBatch
    (StoreID, UserID, Source,Timestamp,Status)
        VALUES (:StoreID,:UserID,:Source,NOW(),:Status)""")

    g.engine.execute(query,
        StoreID=StoreID,
        UserID=session['UserID'],
        Source=source,
        Status='New')

    batch_id = g.engine.execute('SELECT LAST_INSERT_ID() AS id').fetchone()
    return batch_id['id']

なぜこれが1つずれるのかについてのアイデアはありますか(たとえば、9ではなく8を返す)?

4

3 に答える 3

4

SQLAlchemyのドキュメントがEngine.executeについて何と言っているか見てみましょう。

この関数を呼び出すたびに、暗黙的に新しい接続を取得しています。別のセッションでlast_idを選択している場合、INSERTはまだコミットされていないと思います。

于 2012-08-11T10:19:23.680 に答える
4

クエリが不正確な ID を返す理由はまだわかりません。ただし、暗黙的/コネクションレス実行を使用するのではなく、接続オブジェクトを取得することで問題を回避したようです。おそらく、以前は 2 つの異なる接続を取得していたため、一貫性のない結果が得られていました。

    conn = g.engine.connect()

    query = text("""INSERT INTO HR_PunchBatch
        (StoreID, UserID, Source,Timestamp,Status)
        VALUES (:StoreID,:UserID,:Source,NOW(),:Status)""")

    conn.execute(query,
        StoreID=StoreID,
        UserID=session['UserID'],
        Source=source,
        Status='New')

    batch_id = conn.execute('SELECT LAST_INSERT_ID() AS id').fetchone()

    return batch_id['id']
于 2012-08-10T19:07:39.783 に答える
1

Cursor.lastrowid

この読み取り専用属性は、最後に変更された行の行 ID を提供します (ほとんどのデータベースは、単一の INSERT 操作が実行された場合にのみ行 ID を返します)。操作でROWIDが設定されない場合、またはデータベースがROWIDをサポートしていない場合、この属性はNoneに設定する必要があります。

http://www.python.org/dev/peps/pep-0249/

import MySQLdb
conn = MySQLdb.connect('localhost', 'usr', 'pswrd', 'db');
cur = conn.cursor()
cur.execute('INSERT IGNORE INTO  table (name) VALUES "text"')
conn.commit()

print cur.lastrowid # print LAST_INSERT_ID()
于 2013-11-18T08:55:30.673 に答える