Sto utilizzando Elixir in un progetto che si collega a un database Postgres. Voglio eseguire la seguente query sul database a cui sono connesso, ma non sono sicuro di come farlo poiché sono piuttosto nuovo per Elixir e SQLAlchemy. Qualcuno sa come?Esegui query SQL con Elixir
VACUUM FULL ANALYZE table
Aggiornamento
L'errore è: "UnboundExecutionError: Impossibile trovare un vicolo cieco configurato sull'espressione SQL o questa sessione". E lo stesso risultato con session.close() emesso prima. Ho provato a fare metadata.bind.execute() e questo ha funzionato per una semplice selezione. Ma per il VACUUM ha detto: "InternalError: (InternalError) VACUUM non può essere eseguito all'interno di un blocco di transazione", quindi ora sto cercando di capire come disattivarlo.
Update 2
posso ottenere la query da eseguire, ma sto ancora ricevendo lo stesso errore - anche quando creo una nuova sessione e chiudere quello precedente.
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()
e l'uscita che ottengo è
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
Grazie a tutti coloro che hanno risposto.
Non sono riuscito a trovare la soluzione che volevo, ma penso che andrò con quella descritta qui
PostgreSQL - how to run VACUUM from code outside transaction block?. Non è l'ideale, ma funziona.
Ho provato, ma ho ottenuto un UnboundExecutionError. session è un'istanza di sqlalchemy.orm.scoping.ScopedSession e quando chiamo session.commit() per le mie altre query, funziona. Importa se è prima o dopo il commit? – mozillalives
Puoi provare a fare session.close() prima di eseguire l'istruzione. Inoltre, si spera che l'errore sia arrivato con traceback, cosa dice? –
"UnboundExecutionError: impossibile trovare un binding configurato sull'espressione SQL o in questa sessione". E lo stesso risultato con session.close() emesso prima. Ho provato a fare metadata.bind.execute() e questo ha funzionato per una semplice selezione. Ma per il VACUUM ha detto: "InternalError: (InternalError) VACUUM non può essere eseguito all'interno di un blocco di transazione", quindi ora sto cercando di capire come disattivarlo. – mozillalives