如何使用psycopg2将过程作为SQL语句的一部分进行调用

时间:2015-03-16 21:01:03

标签: postgresql psycopg2

如何使用psycopg2执行以下插入?

INSERT INTO file (name, volume) 
VALUES ('foo', (select id from volume where volume.name='bar'));

这当然不起作用:

cursor.execute("INSERT INTO file (name,volume) VALUES (%s,%s)","foo","(select id from volume where volume.name='bar')")
可以通过调用存储过程替换

select id from volume where volume.name='bar'

lookup_vol_id('bar')

由于

2 个答案:

答案 0 :(得分:0)

您可以使用INSERT...SELECT INSERT形式,例如:

INSERT INTO file (name,volume)
SELECT 'foo', (select id from volume where volume.name='bar');

或者如果namecolumn是该表中的唯一列,则按顺序,您可以完全省略列名称:

INSERT INTO file
SELECT 'foo', (select id from volume where volume.name='bar');

SQL 字符串可以传递到cursor.execute(不带分号)。

顺便说一句,看起来volume列可能会重命名为volume_id,因为它是id表中的volume列。< / p>

答案 1 :(得分:0)

我现在无法测试它,但我希望这样的东西可以工作:

cursor.execute("INSERT INTO file (name, volume) "
               " VALUES (%s, "
               "   (SELECT id FROM volume WHERE volume.name = %s))",
               "foo", "bar")