Python Postgresql-使用sqlalchemy';s从选择中插入

Python Postgresql-使用sqlalchemy';s从选择中插入,python,postgresql,sqlalchemy,insert-update,Python,Postgresql,Sqlalchemy,Insert Update,正如所指出的,使用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版,他们介绍了理论上应该处理上述问题的方法 可能吗?如果可能,如何实现?(因为我想利用result.inserted_

正如所指出的,使用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版,他们介绍了理论上应该处理上述问题的方法

可能吗?如果可能,如何实现?(因为我想利用result.inserted_primary_键,该键在使用原始sql时不会返回)

如何为“from_select”部分使用bindparams,因为我似乎唯一可以使用它的方法是在select中使用表列

e、 g

输出:

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))

只有当您已经知道主键并且想要创建它(如果它不存在)时,才可以安全地执行您发出的命令。如果您使用的是非唯一密钥,那么它会受到竞争条件的影响,这会导致多个插入同时成功运行。即使如此,该命令也不一定会成功,如果它与另一个并发插入争用,它可能会失败并出现唯一的冲突错误。要了解更多信息,请阅读upsert on PostgreSQL在堆栈溢出方面的其他许多讨论。我使用的密钥是唯一的,并发插入不应该(希望)有任何问题。我在这里遇到的问题是sqlalchemy的语法,让它在select中使用我自己的参数(通过bindparams或任何其他方式),而不是使用表列。这在8.4.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))