20 votes

Postgresql - Insérer dans where not exists en utilisant l'INSERT de SELECT de sqlalchemy

Comme indiqué ici, il est possible de faire ce qui suit avec postgresql 9.1+

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

J'ai joué un peu avec la version 0.9 de sqlalchemy où ils ont introduit la méthode INSERT from SELECT qui devrait théoriquement gérer ce qui précède.

Est-ce possible et si oui comment? (car je veux tirer parti du result.inserted_primary_key qui n'est pas retourné lors de l'utilisation du SQL brut)

Comment puis-je utiliser les bindparams pour la partie 'from_select' car la seule façon que je semble pouvoir l'utiliser est lorsque j'utilise les colonnes de table dans le select.

par exemple

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 'faire quelque chose avec result.inserted_primary_key'

24voto

zzzeek Points 22617
from sqlalchemy import *

"""
INSÉRER DANS example_table
    (id, name)
SÉLECTIONNER 1, 'John'
OÙ
    NON EXISTE (
        SÉLECTIONNER id DE example_table OÙ 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)

sortie:

INSÉRER DANS example_table (id, name) SÉLECTIONNER :param_1 EN TANT QUE anon_1, :param_2 EN TANT QUE anon_2
OÙ NON (EXISTE (SÉLECTIONNER example_table.id
DE example_table
OÙ example_table.id = :id_1))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X