2017-09-27 2 views
0

En db j'ai une table appelée registre qui a l'id-mail comme clé primaire. J'avais l'habitude de soumettre en vrac en utilisant session.add_all(). Mais parfois certains enregistrements existent déjà; dans ce cas, je veux séparer les enregistrements existants et non existants.Comment vérifier si une liste de clés primaires existe déjà dans DB dans une seule requête?

+0

Quel DB utilisez-vous? –

+0

J'utilise Postgres – katrik

+0

Vous pourriez éventuellement utiliser le nouveau [INSERER ... SUR CONFLIT NE RIEN FAIRE] (http://docs.sqlalchemy.org/fr/latest/dialects/postgresql.html#insert-on-conflict-upsert) pour obtenir les données là-bas, au moins. Si vous utilisez assez récent Postgres, c'est. –

Répondre

-1

utilisateur inspecteur SQL ALchemys pour cela:

inspector = inspect(engine) 
inspector.get_primary_keys(table, schema) 

Inspecteur « reflète » toutes les clés primaires et vous pouvez vérifier agaist la liste retournée.

+0

Je pense que ce qu'ils recherchent est une forme d'insertion en bloc qui ignorerait les clés existantes au lieu d'échouer. Il semble qu'ils sachent à quelles colonnes se compose la clé primaire ("mail-id"). –

1

http://docs.sqlalchemy.org/en/latest/orm/session_api.html#sqlalchemy.orm.session.Session.merge

Si tous les objets que vous ajoutez à la base de données sont complètes (par exemple, le nouvel objet contient au moins toutes les informations qui existaient pour l'enregistrement dans la base de données), vous pouvez utiliser Session.merge(). Effectivement, merge() créera ou mettra à jour la ligne existante (en trouvant la clé primaire si elle existe dans la session/base de données et en copiant l'état en face de l'objet que vous fusionnez). La chose essentielle à prendre en compte est que les valeurs d'attribut de l'objet passé à fusionner écraseront celles qui existaient déjà dans la base de données.

Je pense que ce n'est pas si bon en termes de performances, donc si cela est important, SQLAlchemy a quelques opérations en masse. Vous devez vérifier l'existence de l'ensemble des clés primaires qui seront ajoutées/mises à jour et effectuer une insertion en bloc pour les objets qui n'existaient pas et une mise à jour en bloc pour celles qui l'ont été. La documentation contient des informations sur les opérations en masse si elle doit être une approche haute performance.

http://docs.sqlalchemy.org/en/latest/orm/persistence_techniques.html#bulk-operations

+0

Salut Rach, Merge fonctionnera pour moi de cette façon, mais je veux aussi savoir quelles clés primaires étaient déjà présentes de manière optimisée. – katrik