如何在sqlalchemy.engine.Connection中设置autocommit = 1

20 投票
6 回答
45313 浏览
提问于 2025-05-01 08:19

在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

来自 SQLAlchemy文档:理解自动提交

conn = engine.connect()
conn.execute("INSERT INTO users VALUES (1, 'john')")  # autocommits

“自动提交”这个功能只有在没有声明其他Transaction(事务)的情况下才会生效。这意味着这个功能通常不和ORM一起使用,因为Session对象默认总是保持一个正在进行的Transaction

你可以通过Connection.execution_options()这个方法来完全控制“自动提交”的行为。这个方法可以在ConnectionEngineExecutable上使用,里面有一个“自动提交”的选项,可以用来开启或关闭特定范围内的自动提交。例如,一个表示存储过程的text()构造可能会使用这个功能,这样当执行SELECT语句时就会自动提交:

engine.execute(text("SELECT my_mutating_procedure()").execution_options(autocommit=True))

撰写回答