python first Postgresql-Einfügen in wo nicht existiert mit SQL INSERT von SELECT



python postgresql (1)

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)

Ausgabe:

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

Wie bereits erwähnt, ist es möglich, mit postgresql 9.1+ Folgendes zu tun

INSERT INTO example_table
    (id, name)
SELECT 1, 'John'
WHERE
    NOT EXISTS (
        SELECT id FROM example_table WHERE id = 1
    );

Ich habe mit Version 0.9 von sqlalchemy herumgespielt, wo sie INSERT von der SELECT- Methode eingeführt haben, die theoretisch das oben genannte behandeln sollte.

Ist es möglich und wenn ja wie? (da ich den result.inserted_primary_key nutzen möchte, der bei Verwendung von raw sql nicht zurückgegeben wird)

Wie kann ich bindparams für den "from_select" -Teil verwenden, da der einzige Weg, wie ich es benutzen kann, ist, wenn ich Tabellenspalten in der Auswahl verwende.

z.B

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'




insert-update