正如here指出的那样,可以使用postgresql 9.1 +
执行以下操作INSERT INTO example_table
(id, name)
SELECT 1, 'John'
WHERE
NOT EXISTS (
SELECT id FROM example_table WHERE id = 1
);
我一直在玩sqlalchemy的0.9版本,他们已经引入了INSERT from SELECT方法,理论上应该处理上述问题。
有可能,如果可能,怎么样? (因为我想利用在使用原始sql时未返回的result.inserted_primary_key)
如何在'from_select'部分使用bindparams作为我可以使用它的唯一方法是在select中使用表格列。
e.g。
insrt = example_table.insert().
from_select(['id', 'name'],
example_table.select().
where(~exists(select([example_table.c.id],
example_table.c.id == 1))))
result = session.execute(insrt)
if result.is_insert:
print 'do something with result.inserted_primary_key'
答案 0 :(得分:11)
from sqlalchemy import *
"""
INSERT INTO example_table
(id, name)
SELECT 1, 'John'
WHERE
NOT EXISTS (
SELECT id FROM example_table WHERE id = 1
);
"""
m = MetaData()
example_table = Table("example_table", m,
Column('id', Integer),
Column('name', String)
)
sel = select([literal("1"), literal("John")]).where(
~exists([example_table.c.id]).where(example_table.c.id == 1)
)
ins = example_table.insert().from_select(["id", "name"], sel)
print(ins)
输出:
INSERT INTO example_table (id, name) SELECT :param_1 AS anon_1, :param_2 AS anon_2
WHERE NOT (EXISTS (SELECT example_table.id
FROM example_table
WHERE example_table.id = :id_1))