4

我有一个用 Python 编写的 Web 应用程序,使用 SQLAlchemy 进行数据访问。我正在尝试获取插入的最后一个插入 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)?

4

3 回答 3

4

仍然不确定查询返回不准确 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']
于 2012-08-10T19:07:39.783 回答
4

看看 SQLAlchemy 文档对Engine.execute的看法。

每次调用此函数时,您都会隐含地获得新连接。我的猜测是,当您在不同的会话中选择 last_id 时,您的 INSERT 尚未提交。

于 2012-08-11T10:19:23.680 回答
1

光标.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()
于 2013-11-18T08:55:30.673 回答