J'utilise Elixir dans un projet qui se connecte à une base de données postgres. Je veux exécuter la requête suivante sur la base de données à laquelle je suis connecté, mais je ne suis pas sûr de savoir comment le faire car je suis plutôt nouveau à Elixir et SQLAlchemy. Quelqu'un sait comment?Exécuter une requête sql avec Elixir
VACUUM FULL ANALYZE table
Mise à jour
L'erreur est: "UnboundExecutionError: Impossible de trouver une liaison configurée sur l'expression SQL ou cette session". Et le même résultat avec session.close() émis avant. J'ai essayé de faire metadata.bind.execute() et cela a fonctionné pour une sélection simple. Mais pour le VACUUM il a dit - "InternalError: (InternalError) VACUUM ne peut pas courir à l'intérieur d'un bloc de transaction", alors maintenant j'essaie de comprendre comment désactiver cela.
Mise à jour 2
Je peux obtenir la requête à exécuter, mais je reçois toujours la même erreur - même lorsque je crée une nouvelle session et fermer le précédent.
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
# ... insert stuff
old_session.commit()
old_session.close()
new_sess = sessionmaker(autocommit=True)
new_sess.configure(bind=create_engine('postgres://user:[email protected]/db', echo=True))
sess = new_sess()
sess.execute('VACUUM FULL ANALYZE table')
sess.close()
et la sortie que je reçois est
2009-12-10 10:00:16,769 INFO sqlalchemy.engine.base.Engine.0x...05ac VACUUM FULL ANALYZE table
2009-12-10 10:00:16,770 INFO sqlalchemy.engine.base.Engine.0x...05ac {}
2009-12-10 10:00:16,770 INFO sqlalchemy.engine.base.Engine.0x...05ac ROLLBACK
finishing failed run, (InternalError) VACUUM cannot run inside a transaction block
'VACUUM FULL ANALYZE table' {}
Mise à jour 3
Merci à tous ceux qui ont répondu.
Je n'étais pas capable de trouver la solution que je voulais, mais je pense que je vais juste aller avec celui décrit ici
PostgreSQL - how to run VACUUM from code outside transaction block?. Ce n'est pas idéal, mais ça fonctionne.
J'ai essayé, mais j'ai obtenu un UnboundExecutionError. session est une instance de sqlalchemy.orm.scoping.ScopedSession et lorsque j'appelle session.commit() pour mes autres requêtes, cela fonctionne. Est-ce important si c'est avant ou après la validation? – mozillalives
Vous pouvez essayer de faire session.close() avant d'exécuter l'instruction. En outre, l'erreur est venue avec traceback, qu'est-ce que cela dit? –
"UnboundExecutionError: Impossible de localiser une liaison configurée sur l'expression SQL ou cette session". Et le même résultat avec session.close() émis avant. J'ai essayé de faire metadata.bind.execute() et cela a fonctionné pour une sélection simple. Mais pour le VACUUM il a dit - "InternalError: (InternalError) VACUUM ne peut pas courir à l'intérieur d'un bloc de transaction", alors maintenant j'essaie de comprendre comment désactiver cela. – mozillalives