Ich verwende Elixir in einem Projekt, das eine Verbindung zu einer Postgres-Datenbank herstellt. Ich möchte die folgende Abfrage für die Datenbank ausführen, mit der ich verbunden bin, aber ich weiß nicht, wie ich das machen soll, da ich für Elixir und SQLAlchemy ziemlich neu bin. Wer weiß wie?SQL-Abfrage mit Elixir ausführen
VACUUM FULL ANALYZE table
aktualisieren
Der Fehler ist: "UnboundExecutionError: Es konnte keine bind konfiguriert SQL-Expression oder diese Sitzung lokalisieren". Und das gleiche Ergebnis mit session.close() zuvor ausgegeben. Ich habe versucht, metadata.bind.execute() und das für eine einfache Auswahl funktioniert. Aber für die VACUUM hieß es - "InternalError: (InternalError) VACUUM kann nicht innerhalb eines Transaktionsblocks laufen", also versuche ich jetzt herauszufinden, wie ich das ausschalten kann.
Update 2
ich die Abfrage bekommen kann ausführen, aber ich bin immer noch die gleichen Fehler - auch wenn ich eine neue Sitzung erstellt und die vorherigen schließen.
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()
und die Ausgabe ich erhalte, ist
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' {}
Update 3
Vielen Dank an alle, die geantwortet haben.
Ich war nicht in der Lage, die Lösung zu finden, die ich wollte, aber ich denke, ich gehe nur mit dem hier beschriebenen
PostgreSQL - how to run VACUUM from code outside transaction block?. Es ist nicht ideal, aber es funktioniert.
Ich habe das versucht, aber ich habe einen UnboundExecutionError. Sitzung ist eine Instanz von sqlalchemy.orm.scoping.ScopedSession und wenn ich session.commit() für meine anderen Abfragen aufrufen, funktioniert das. Ist es wichtig, ob es vor oder nach dem Commit ist? – mozillalives
Sie können versuchen, session.close() auszuführen, bevor Sie die Anweisung ausführen. Außerdem kam der Fehler hoffentlich mit Traceback, was sagt das? –
"UnboundExecutionError: Konnte eine Bindung nicht finden, die für den SQL-Ausdruck oder diese Sitzung konfiguriert wurde". Und das gleiche Ergebnis mit session.close() zuvor ausgegeben. Ich habe versucht, metadata.bind.execute() und das für eine einfache Auswahl funktioniert. Aber für die VACUUM hieß es - "InternalError: (InternalError) VACUUM kann nicht innerhalb eines Transaktionsblocks laufen", also versuche ich jetzt herauszufinden, wie ich das ausschalten kann. – mozillalives