在SQLAlchemy中获取创建记录的ID
我该如何获取在SQLAlchemy中创建记录的ID?
我正在做:
engine.execute("insert into users values (1,'john')")
2 个回答
3
你可以添加一个额外的部分:RETURNING
也就是说
INSERT INTO users (name, address) VALUES ('richo', 'beaconsfield') RETURNING id
然后就像你在用SELECT语句一样,直接获取一行数据。
14
当你执行一个简单的文本语句时,你就得看你用的数据库接口(DBAPI)能不能给你新的主键(PK)值,以及怎么给你。比如在SQLite和MySQL中,你可以通过结果的.result.lastrowid来获取,这个值就是光标的.lastrowid。而在PostgreSQL、Oracle等数据库中,就没有这个“.lastrowid”了。正如其他人提到的,你可以使用“RETURNING”来获取结果,这样可以通过result.fetchone()来拿到数据(不过在Oracle中使用RETURNING时,如果不利用SQLAlchemy的表达式构造,会有几个麻烦的步骤)。如果没有RETURNING,你可以直接访问序列(在PostgreSQL中用NEXTVAL),或者进行一个“后取”操作(在PostgreSQL中用CURRVAL,在MSSQL中用@@identity或scope_identity())。
听起来是不是很复杂?这就是为什么你最好使用table.insert()
。SQLAlchemy提供的新生成主键的主要方式就是为了配合这些构造而设计的。一旦你使用了这个方法,result.last_inserted_ids()
就能在所有情况下给你新生成的(可能是复合的)主键,不管你用的是什么数据库。上面提到的.lastrowid、序列执行、RETURNING等方法都已经为你处理好了(0.6版本在可用时会使用RETURNING)。