2012-08-10 60 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()