LAST_INSERT_ID()关闭一个

时间:2012-08-10 18:26:46

标签: python mysql sqlalchemy

我有一个使用SQLAlchemy用Python编写的Web应用程序进行数据访问。我正在尝试获取插入的最后一个插入ID。当我使用PyODBC时,此代码正常工作,但现在使用SQLAlchemy它似乎不起作用。 LAST_INSERT_ID()似乎始终返回一个关闭的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 个答案:

答案 0 :(得分: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']

答案 1 :(得分:3)

看看SQLAlchemy文档对Engine.execute所说的内容。

每次调用此函数时,您都隐式获得新连接。我的猜测是,当你在另一个会话中选择last_id时,你的INSERT还没有被提交。

答案 2 :(得分:1)

<强> Cursor.lastrowid

  

此只读属性提供上次修改行的rowid   (大多数数据库仅在单个INSERT操作时返回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()