2012-08-10 91 views
4

我有一個使用SQLAlchemy編寫的用於數據訪問的Web應用程序。我試圖獲取插入的最後一個插入ID。當我使用PyODBC時,此代碼正在工作,但現在使用SQLAlchemy它似乎不工作。 LAST_INSERT_ID()似乎一直返回一個關閉的ID。LAST_INSERT_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'] 

任何想法,爲什麼這將關閉一(例如返回8而不是9)?

回答

3

仍然不確定爲什麼查詢返回的是不準確的ID。但是,我似乎通過獲取連接對象而不是使用隱式/無連接執行來解決此問題。或許正是抓住前兩種不同的連接,因此提供不一致的結果:

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'] 
3

看看什麼SQLAlchemy的文檔有什麼看法Engine.execute

每當你調用這個函數,你都隱式地獲得新的連接。我的猜測是,當你在不同的會話中選擇last_id時,你的INSERT還沒有被提交。

1

Cursor.lastrowid

該只讀屬性提供的最後修改行 的ROWID(大多數數據庫返回一個rowid只有當單個插入操作執行 )。如果操作未設置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()