Как вы получаете право на выполнение сценария SQL?
Мне нужен один лайнер, который будет выполнять и фиксировать любой сценарий, который я ему передаю.
ex:
sqlScript:str = ...
r = execute_and_commit_no_matter_what(sqlScript)
Что происходит, так это то, что sqlalchemy автоматически обнаруживает DDL и, если он присутствует, возвращает открытое соединение. Это действительно раздражает нашу команду, так как наши скрипты постоянно терпят неудачу по какой-то сложной причине (например, они используют временные таблицы и т. Д. c). Поэтому при выполнении сценария с помощью sqlalchemy вы получаете один из трех результатов:
- Вы явно создаете транзакцию и оставляете ее открытой.
- Вы устанавливаете автоматическую фиксацию для соединения, но выбираете SELECT операторы не возвращаются для этого соединения.
- В вашем скрипте есть ddl, и sqlalchemy создает неявную транзакцию, которая остается открытой.
пример:
import sqlalchemy as sa
sqlScript:str = ....
engine = sa.create_engine("mssql+pyodbc://PythonGA...")
#execute with explicit transaction, works fine, but relies on the programmer.
conn = engine.connect()
tran = conn.begin()
r = conn.execute(sqlScript)
tran.commit()
#now there is one problem with the above. I can't actually
# retrieve anything from 'r' after I commit the transaction.
# Hopefully though the programmer will know better.
#2 set auto commit on the transaction
conn = engine.connect().execution_options(autocommit=True)
r = conn.execute(sqlScript)
# This will execute ddl and anything that doesn't return rows.
# However if it returns rows the 'r' object is unreadable.
#3 execute with default connection settings (pyodbc autocommit).
r = engine.execute(sqlScript)
#Here sqlalchemy will detect DDL in the script and leave an open
# connection if it is.
#This is especially hell with temp tables, because won't be created
# by the time any DML that uses those temp tables runs (so just
# committing after running won't work, we have to split the script).
Я хочу иметь возможность выполнять все мои сырые sql сценарии каждый раз одинаково, не зная, что внутри них? Как мне это сделать?