如何使用 ibm_db_sa 和 sqlalchemy 关闭自动提交?
如果表开启了日志功能,则不需要,但该表没有开启日志功能,因此,自动提交必须关闭。
我已经尝试过:
smt = f"db2+ibm_db://{user}:{password}@{hostname}:{port}/{database};autocommit=0"
engine = create_engine(smt, echo=True).execution_options(autocommit=False)
sm = sessionmaker(engine, autocommit=False, autoflush=False)
with sm.begin() as session:
record = User(**user_dict)
session.add(record)
但我得到:
sqlalchemy.exc.ProgrammingError: (ibm_db_dbi.ProgrammingError) ibm_db_dbi::ProgrammingError: Statement Execute Failed: [IBM][CLI Driver][AS] SQL7008N REXX variable "USERSG " contains inconsistent data. SQLSTATE=55019 SQLCODE=-7008
JBDC 连接器已关闭自动提交并且可以正常工作。
编辑:设置 autocommit=True 会产生相同的错误。
我已经尝试过https://stackoverflow.com/a/8245270/9544507并且这个实体框架错误更新iSeries记录他们建议禁用自动comit模式,但似乎不起作用。
我还尝试将isolation_level设置为AUTOCOMMIT和NONE(https://docs.sqlalchemy.org/en/20/core/connections.html#understanding-the-dbapi-level-autocommit-isolation-level)
但这也不起作用:
sqlalchemy.exc.ArgumentError: Invalid value 'AUTOCOMMIT' for isolation_level. Valid isolation levels for ibm_db_sa are RS, UR, CURSOR STABILITY, RR, UNCOMMITTED READ, READ STABILITY, CS, REPEATABLE READ
我只是将其放在答案中,所以我不会将其放入评论中。 但也许可以尝试这个用法。
import ibm_db
connect_args = {
ibm_db.SQL_ATTR_AUTOCOMMIT: ibm_db.SQL_AUTOCOMMIT_OFF,
}
smt = f"db2+ibm_db://{user}:{password}@{hostname}:{port}/{database}"
engine = create_engine(smt,
echo=True,
connect_args=connect_args
)