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

Posted

技术标签:

【中文标题】Python/postgres/psycopg2:获取刚刚插入的行的 ID【英文标题】:Python/postgres/psycopg2: getting ID of row just inserted 【发布时间】:2011-07-11 23:40:01 【问题描述】:

我正在使用 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() 

在使用RETURNING 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 中使用此命令):

sql_string = "SELECT currval(pg_get_serial_sequence('hundred', 'id'));"
hundred_id = cursor.execute(sql_string)

谁能给点建议?

谢谢!

【问题讨论】:

【参考方案1】:
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 文档:http://initd.org/psycopg/docs/usage.html#passing-parameters-to-sql-queries

【讨论】:

澄清一下,RETURNING id 中的id 应该是序列/主键字段的字段名称。 cursor fetchone 给我“没有要获取的结果”。 @Leonid 你明白了吗? @AlisonS @Leonid 我遇到了同样的错误,但将RETURNING id 添加到INSERT 查询的末尾为我修复了它。 也许只是一个小提示,但对大家来说重要的一点是:确保您只使用光标 .execute() 而不是cursor .mogrify()execute() 命令之前,否则(在我的情况下) cursor.fetchone () 不会有任何结果!通过在该命令之前仅使用光标 .execute() 而没有“任何东西”,您将收到一个 id。【参考方案2】:

我最终来到这里是因为我遇到了类似的问题,但我们使用的是 Postgres-XC,它还不支持 RETURNING ID 子句。在这种情况下,您可以使用:

cursor.execute('INSERT INTO ........')
cursor.execute('SELECT LASTVAL()')
lastid = cursor.fetchone()['lastval']

以防万一它对任何人有用!

【讨论】:

请记住 - 如果在您之后但在您的 lastval() 命令返回序列的当前值。 好帖子。如果您使用的是类似 psycopg2.extras.RealDictCursor 的东西,它会将结果作为字典返回,您需要执行类似的操作。当然,同时牢记@Dave Thomas 的评论。【参考方案3】:

考虑一个 RETURNING 子句http://www.postgresql.org/docs/8.3/static/sql-insert.html

【讨论】:

以上是关于Python/postgres/psycopg2:获取刚刚插入的行的 ID的主要内容,如果未能解决你的问题,请参考以下文章