update example python postgresql sqlalchemy insert-update

python - example - Postgresql-Insertar en donde no existe usando INSERT de sqlalchemy de SELECT



sqlalchemy relationship (1)

Como se señala aquí, es posible hacer lo siguiente con postgresql 9.1+

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

He estado jugando con la versión 0.9 de sqlalchemy, donde han introducido INSERT desde el método SELECT que teóricamente debería manejar lo anterior.

¿Es posible y si es así cómo? (como quiero aprovechar el result.inserted_primary_key que no se devuelve cuando se utiliza sql en bruto)

¿Cómo puedo usar bindparams para la parte ''from_select'' ya que la única forma en que puedo parecer que lo uso es cuando uso columnas de tabla en la selección.

p.ej

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


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)

salida:

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