Używam Elixir w projekcie, który łączy się z bazą danych PostgreSQL. Chcę uruchomić następujące zapytanie w bazie danych, z którą jestem połączony, ale nie jestem pewien, jak to zrobić, ponieważ jestem raczej nowym użytkownikiem Elixir i SQLAlchemy. Ktoś wie jak?Wykonaj kwerendę sql z Elixir
VACUUM FULL ANALYZE table
Aktualizacja
Błąd brzmi: "UnboundExecutionError: Nie można zlokalizować wiążą skonfigurowany na wyrażeniu SQL lub tej sesji". I ten sam wynik z session.close() wydany wcześniej. Spróbowałem zrobić metadata.bind.execute() i to działało dla prostego wyboru. Ale dla VACUUM powiedział - "InternalError: (InternalError) VACUUM nie może działać w bloku transakcji", więc teraz próbuję dowiedzieć się, jak to wyłączyć.
Aktualizacja 2
mogę zapytanie do wykonania, ale ja wciąż otrzymuję ten sam błąd - nawet gdy tworzę nową sesję i zamknąć poprzedni.
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()
a wyjście mogę to
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
Dziękujemy wszystkim, którzy odpowiedzieli.
Nie mogłem znaleźć rozwiązania, które chciałem, ale myślę, że pójdę z tym opisanym tutaj
PostgreSQL - how to run VACUUM from code outside transaction block?. To nie jest idealne, ale działa.
Próbowałem, ale dostałem UnboundExecutionError. session jest instancją sqlalchemy.orm.scoping.ScopedSession i kiedy wywołuję session.commit() dla innych moich zapytań, to działa. Czy to ma znaczenie, czy to przed, czy po zatwierdzeniu? – mozillalives
Możesz spróbować zrobić session.close() przed wykonaniem instrukcji. Ponadto, błąd miejmy nadzieję przyszedł z traceback, co to mówi? –
"UnboundExecutionError: Nie można znaleźć powiązania skonfigurowanego w wyrażeniu SQL lub tej sesji". I ten sam wynik z session.close() wydany wcześniej. Spróbowałem zrobić metadata.bind.execute() i to działało dla prostego wyboru. Ale dla VACUUM powiedział - "InternalError: (InternalError) VACUUM nie może działać w bloku transakcji", więc teraz próbuję dowiedzieć się, jak to wyłączyć. – mozillalives