Filtre SQLAlchemy dans l'opérateur
Je suis en train de faire une simple opération de filtrage sur une requête dans sqlalchemy, comme ceci:
q = session.query(Genotypes).filter(Genotypes.rsid.in_(inall))
où
inall est une liste de chaînes
Les génotypes est mappé à une table:
classe Génotypes(objet):
passer
Genotypes.mapper = mapper(Genotypes, kg_table, properties={'rsid': getattr(kg_table.c, 'rs#')})
Cela semble assez simple pour moi, mais j'obtiens l'erreur suivante lorsque j'exécute la requête ci-dessus en faisant q.first()
:
"sqlalchemy.exc.OperationalError: (OperationalError) trop de SQL
les variables u SELECT", suivi par une liste de la 1M éléments dans le inall
liste. Mais ils ne sont pas censés être des variables SQL, juste une liste dont
l'adhésion est le critère de filtrage.
Suis-je en train de faire le filtrage de façon incorrecte?
(db sqlite)
source d'informationauteur user1988705
Vous devez vous connecter pour publier un commentaire.
Si la table où vous êtes l'obtention de votre
rsid
s est disponible dans la même base de données que j'avais utiliser un sous-requête de les faire passer dans votreGenotypes
requête plutôt que de passer le million d'entrées dans votre code Python.Le problème est que dans le but de transmettre cette liste à SQLite (ou toute base de données, vraiment), SQLAlchemy a passer au-dessus de chaque entrée de votre
in
clause comme une variable. Le SQL se traduit approximativement à:Ci-dessous la solution a fonctionné pour moi:
Ce essentiellement les forces de la requête pour compiler comme une chaîne de caractères avant l'exécution, qui contourne l'ensemble de variables du problème. Certains détails sont disponibles à ce sujet dans SQLAlchemy de docs ici.
BTW, si vous n'êtes pas en utilisant SQLite, vous pouvez utiliser l'opérateur de transmettre la liste d'objet que d'un seul paramètre (voir ma réponse à cette question ici).