Comment exécutez-vous le SQL brut dans SQLAlchemy?
J'ai une application web python qui s'exécute sur le flacon et s'interface avec la base de données via SQLAlchemy.
J'ai besoin d'un moyen d'exécuter le SQL brut. La requête implique plusieurs jointures de table ainsi que des vues en ligne.
J'ai essayé:
connection = db.session.connection()
connection.execute( <sql here> )
Mais je continue à recevoir des erreurs de passerelle.
python
sql
sqlalchemy
flask
flask-sqlalchemy
starwing123
la source
la source
namedtuple
etdict
directement: initd.org/psycopg/docs/extras.html .Réponses:
As-tu essayé:
ou:
la source
BEGIN
etCOMMIT
vous-même.db.engine.execute(text("<sql here>")).execution_options(autocommit=True))
l'exécute et le valide également.Les objets de session SQL Alchemy ont leur propre
execute
méthode:Toutes vos requêtes d'application doivent passer par un objet session, qu'elles soient SQL brut ou non. Cela garantit que les requêtes sont correctement gérées par une transaction , ce qui permet à plusieurs requêtes dans la même demande d'être validées ou annulées en une seule unité. Sortir de la transaction en utilisant le moteur ou la connexion vous expose à un risque beaucoup plus important de bogues subtils, éventuellement difficiles à détecter, qui peuvent vous laisser des données corrompues. Chaque demande doit être associée à une seule transaction, et l'utilisation
db.session
garantira que c'est le cas pour votre application.Notez également qu'il
execute
est conçu pour les requêtes paramétrées . Utilisez des paramètres, comme:val
dans l'exemple, pour toutes les entrées de la requête pour vous protéger des attaques par injection SQL. Vous pouvez fournir la valeur de ces paramètres en passant adict
comme deuxième argument, où chaque clé est le nom du paramètre tel qu'il apparaît dans la requête. La syntaxe exacte du paramètre lui-même peut être différente selon votre base de données, mais toutes les principales bases de données relationnelles les prennent en charge sous une forme ou une autre.En supposant que c'est une
SELECT
requête, cela retournera un itérable d'RowProxy
objets.Vous pouvez accéder à des colonnes individuelles avec une variété de techniques:
Personnellement, je préfère convertir les résultats en
namedtuple
s:Si vous n'utilisez pas l'extension Flask-SQLAlchemy, vous pouvez toujours utiliser facilement une session:
la source
docs: Didacticiel SQL Expression Language - Utilisation de texte
exemple:
la source
==
?=
est normalement réservé à l' attribution d' une valeur; alors qu'il==
est réservé pour comparer les valeursVous pouvez obtenir les résultats des requêtes SQL SELECT à l'aide de
from_statement()
ettext()
comme indiqué ici . Vous n'avez pas à gérer les tuples de cette façon. À titre d'exemple pour une classeUser
ayant le nom de table,users
vous pouvez essayer,la source
exécute le
<sql here>
mais ne le valide pas sauf si vous êtes enautocommit
mode. Ainsi, les insertions et les mises à jour ne se refléteraient pas dans la base de données.Pour vous engager après les modifications, faites
la source
Tout d'abord, mappez votre module (si votre module / application est manage.py dans le dossier principal et que vous êtes dans un système d'exploitation UNIX), exécutez:
Run Flask shell
Importez ce dont nous avons besoin ::
Exécutez votre requête:
Cela utilise la connexion à la base de données actuellement qui a l'application.
la source
Avez-vous essayé d'utiliser
connection.execute(text( <sql here> ), <bind params here> )
et de lier des paramètres comme décrit dans la documentation ? Cela peut aider à résoudre de nombreux problèmes de mise en forme des paramètres et de performances. Peut-être que l'erreur de passerelle est un délai d'attente? Les paramètres de liaison ont tendance à accélérer considérablement l'exécution des requêtes complexes.la source
connection.execute(text(<sql here>), <bind params> )
.bind params
ne devrait PAS être dedanstext()
. alimentation des paramètres de liaison à la méthode execute ()Si vous voulez éviter les tuples, une autre méthode consiste à appeler les méthodes
first
,one
ouall
:la source