如何在SQLAlchemy中获取已创建记录的ID?
我在做:
engine.execute("insert into users values (1,'john')")
答案 0 :(得分:14)
当您执行纯文本语句时,您将使用您正在使用的DBAPI,无论新PK值是否可用以及通过何种方式。使用SQlite和MySQL DBAPI,你可以将它作为result.lastrowid,它只为你提供光标的.lastrowid值。对于PG,Oracle等,没有“.lastrowid” - 正如其他人所说,你可以使用“RETURNING”来处理那些通过result.fetchone()获得结果的人(虽然使用了带有oracle的RETURNING,再次没有利用SQLAlchemy表达式构造,需要几个笨拙的步骤),或者如果RETURNING不可用,你可以使用直接序列访问(pg中的NEXTVAL),或“post fetch”操作(PG中的CURRVAL,@@ identity或scope_identity() MSSQL)。
听起来很复杂吧?这就是为什么你最好使用table.insert()
。 SQLAlchemy提供新生成的PK的主要系统旨在使用这些结构。就在那里,result.last_inserted_ids()
方法在所有情况下都为您提供新生成的(可能是复合的)PK,无论后端如何。上面的.lastrowid,sequence execution,RETURNING等方法都是为你处理的(0.6在可用时使用RETURNING)。
答案 1 :(得分:3)
您可以添加一个额外的条款:RETURNING
即
INSERT INTO users (name, address) VALUES ('richo', 'beaconsfield') RETURNING id
然后只需检索一行,就像insert是SELECT语句一样。