我使用postgresql 8.0.2和amazon redshift,我试图设置INSERT
命令,同时返回PRIMARY KEY
。
我原本试图做以下事情:
with get_connection() as conn:
with conn.cursor() as cur:
cur.execute('INSERT INTO orders (my_id, my_amount) \
VALUES (%s, %s) RETURNING row_id;', (some_id, some_amount))
conn.commit()
但是,RETURNING
命令仅适用于postgresql 8.2及更高版本。
我看到currval
可能是让它工作的可能方法,但我读到它需要一个序列对象。
我试图插入以下架构
CREATE SEQUENCE order_seq;
CREATE TABLE IF NOT EXISTS orders
(
order_id INTEGER IDENTITY(1,1) PRIMARY KEY DISTKEY,
)
然后做:
with get_connection() as conn:
with conn.cursor() as cur:
cur.execute('INSERT INTO orders (my_id, my_amount) \
VALUES (%s, %s);', (some_id, some_amount))
conn.commit()
cur.execute('SELECT currval();')
row_id = cursor.fetchone()[0]
更新:redshift也不支持序列对象。我觉得这是一个非常基本的过程,但没有简单的方法来获取对当前行的引用。
答案 0 :(得分:1)
只需将列定义为:
order_id INTEGER PRIMARY KEY DISTKEY
创建序列时order_seq
使用此命令作为插入命令:
cur.execute('INSERT INTO orders (order_id, my_id, my_amount) \
VALUES (nextval(''order_seq''), %s, %s);', (some_id, some_amount))
由于您使用的是序列,因此必须在insert命令中添加字段才能正确使用nextval
。
要检索当前序列值,请执行以下操作:
cur.execute('SELECT currval(''order_seq'')')
row_id = cursor.fetchone()[0]
我对你使用的语言并不熟悉,所以你可能不得不改变语法来改变我使用的双引号。
nextval
和currval
的语法如:nextval('sequenceName')
和currval('sequenceName')
因此,如果它不支持sequences
,我认为它可以解决您的问题的唯一方法是执行以下步骤:
select max(order_id) from orders
)提取到变量