如何在sqlalchemy.engine.Connection中设置autocommit = 1
在sqlalchemy中,我建立了连接:
conn = engine.connect()
我发现这会在我的mysqld日志中将autocommit设置为0。
现在我想把autocommit设置为1,因为我不想在一个事务中进行查询。
有没有办法做到这一点?
6 个回答
3
如果你正在为一个使用 Flask 或 Django 的 Python 应用配置 SQLAlchemy,你可以这样创建数据库引擎:
# Configure the SqlAlchemy part of the app instance
app.config['SQLALCHEMY_DATABASE_URI'] = conn_url
session_options = {
'autocommit': True
}
# Create the SqlAlchemy db instance
db = SQLAlchemy(app, session_options=session_options)
4
我可能来得有点晚,但对于使用 sqlalchemy 版本大于等于 2.0.* 的朋友来说,上面的解决方案可能不太管用,因为我试过也没成功。
所以,我查阅了官方文档,下面的解决方案对我有效。
from sqlalchemy import create_engine
db_engine = create_engine(database_uri, isolation_level="AUTOCOMMIT")
上面的代码适用于你想在引擎层面设置自动提交的情况。不过,如果你只想对某个特定的查询使用自动提交,可以使用下面的代码 -
with engine.connect().execution_options(isolation_level="AUTOCOMMIT") as connection:
with connection.begin():
connection.execute("<statement>")
10
你可以使用这个:
from sqlalchemy.sql import text
engine = create_engine(host, user, password, dbname)
engine.execute(text(sql).execution_options(autocommit=True))
12
你用什么样的方言来连接mysql呢?
你可以把autocommit
设置为True
来解决这个问题,像这样写:mysql+mysqldb://user:password@host:port/db?charset=foo&autocommit=true
18
conn = engine.connect()
conn.execute("INSERT INTO users VALUES (1, 'john')") # autocommits
“自动提交”这个功能只有在没有声明其他Transaction
(事务)的情况下才会生效。这意味着这个功能通常不和ORM一起使用,因为Session
对象默认总是保持一个正在进行的Transaction
。
你可以通过Connection.execution_options()
这个方法来完全控制“自动提交”的行为。这个方法可以在Connection
、Engine
和Executable
上使用,里面有一个“自动提交”的选项,可以用来开启或关闭特定范围内的自动提交。例如,一个表示存储过程的text()
构造可能会使用这个功能,这样当执行SELECT语句时就会自动提交:
engine.execute(text("SELECT my_mutating_procedure()").execution_options(autocommit=True))