使用Python中的psycopg2获取插入到Redshift表中的行的自动ID

Zac*_*Zac 5 python psycopg2 amazon-web-services python-2.7 amazon-redshift

我正在使用psycopg2库从Python 2.7将记录插入到Amazon Redshift表中,我想找回为插入的行自动生成的主ID。

我尝试了使用Google搜索可以在这里或其他网站中找到的常用方法,例如:

conn=psycopg2.connect(conn_str)
conn.autocommit = True

sql = "INSERT INTO schema.table (col1, col2) VALUES (%s, %s) RETURNING id;"

cur = conn.cursor()
cur.execute(sql,(val1,val2))
id = cur.fetchone()[0]
Run Code Online (Sandbox Code Playgroud)

我在cur.execute行上收到错误消息:

ProgrammingError: syntax error at or near "RETURNING"
Run Code Online (Sandbox Code Playgroud)

有人知道如何解决此问题或完成同一件事吗?

我必须在代码中使用psycopg2

Fem*_*emi 5

目前无法使用 Redshift,因为它不支持通过 RETURNING 语法返回最后一个插入 ID。您可能需要做的是SELECT MAX(id) FROM schema.table;在事务中使用一个内部事务,这可能不是您想要听到的,但似乎是您对 Redshift 当前状态所能做的最好的事情。

  • 可悲的是,这不是真的。我在我的例子中尝试了 Max(id) 方法,但 redshift 不会按顺序增加标识列值......即它可以在生成的 id 之间留下间隙。新生成的 id 保证是唯一的,但不一定高于 Max(id) ,它可以低于。例如,表上的当前 id 可以是 1、2、6、7、8,并且插入新记录,它可以被分配 3,这是唯一的但不超过 max(id) 的 id。 (3认同)
  • @MarSoft 我意识到这条评论很旧,但是,由于 REDSHIFT 的分片/分布式特性,使用“IDENTITY(1,1)”并没有帮助。每个节点或切片都以不会重复或冲突的方式从 ID 的不同子集分配。这意味着节点不需要相互交谈来分配身份,但这也意味着“顺序”/“有序”分配是***不***保证的。 (2认同)