Python/postgres/psycopg2:获取刚刚插入的行的ID

Python/postgres/psycopg2:获取刚刚插入的行的ID,python,postgresql,psycopg2,Python,Postgresql,Psycopg2,我正在使用Python和psycopg2与postgres进行接口 当我插入一行时 sql_string = "INSERT INTO hundred (name,name_slug,status) VALUES (" sql_string += hundred_name + ", '" + hundred_slug + "', " + status + ");" cursor.execute(sql_string) 。。。如何获取刚刚插入的行的ID?尝试: hundred = cursor.

我正在使用Python和psycopg2与postgres进行接口

当我插入一行时

sql_string = "INSERT INTO hundred (name,name_slug,status) VALUES ("
sql_string += hundred_name + ", '" + hundred_slug + "', " + status + ");"
cursor.execute(sql_string)
。。。如何获取刚刚插入的行的ID?尝试:

hundred = cursor.fetchall() 
使用返回id时返回错误:

sql_string = "INSERT INTO domes_hundred (name,name_slug,status) VALUES ("
sql_string += hundred_name + ", '" + hundred_slug + "', " + status + ") RETURNING id;"
hundred = cursor.execute(sql_string)
只需返回
None

更新:
currval
(即使在postgres中直接使用此命令):

有人能提供建议吗

谢谢

cursor.execute("INSERT INTO .... RETURNING id")
id_of_new_row = cursor.fetchone()[0]
请不要手动生成包含值的SQL字符串。您可以(而且应该!)单独传递值,这样就不需要转义,也不可能进行SQL注入:

sql_string = "INSERT INTO domes_hundred (name,name_slug,status) VALUES (%s,%s,%s) RETURNING id;"
cursor.execute(sql_string, (hundred_name, hundred_slug, status))
hundred = cursor.fetchone()[0]

查看psycopg文档了解更多详细信息:

考虑一个返回子句

我在这里结束是因为我有一个类似的问题,但我们使用的是Postgres XC,它还不支持返回ID子句。在这种情况下,您可以使用:

cursor.execute('INSERT INTO ........') cursor.execute('SELECT LASTVAL()') lastid = cursor.fetchone()['lastval'] cursor.execute('插入……。) cursor.execute('SELECT LASTVAL()')) lastid=cursor.fetchone()['lastval']
以防它对任何人都有用

只是想澄清一下,
返回id
中的
id
应该是串行/主键字段的字段名。cursor fetchone给我“无需获取结果”。@Leonid你明白了吗?@AlisonS@Leonid我也有同样的错误,但是在
INSERT
查询的末尾添加
RETURNING id
对我来说已经解决了这个问题。也许只是一个小提示,但对每个人来说都很重要:确保在execute()命令之前只使用cursor.execute(),而不是cursor.mogrify(),否则(就像我的情况一样)cursor.fetchone()将不会有任何结果!如果在该命令之前只使用cursor.execute(),而不使用“anything”,您将收到一个id。请记住,如果有什么东西直接在您之后、但在lastval()命令返回序列的当前值之前将行插入数据库,那么在这样的两个语句中执行该操作会产生竞争条件的风险(非常小)。 cursor.execute('INSERT INTO ........') cursor.execute('SELECT LASTVAL()') lastid = cursor.fetchone()['lastval']