如何在 SqlAlchemy 中使用 ibm db2 for i 禁用自动comit

问题描述 投票:0回答:1

如何使用 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

python sqlalchemy db2 db2-400
1个回答
0
投票

我只是将其放在答案中,所以我不会将其放入评论中。 但也许可以尝试这个用法。

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
)
© www.soinside.com 2019 - 2024. All rights reserved.