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的主要内容,如果未能解决你的问题,请参考以下文章