使用pyodbc更新AS400/DB2数据遇SQL7008错误求助
问题:pyodbc连接AS400执行UPDATE时触发SQL7008错误
使用pyodbc通过iSeries Access ODBC Driver连接AS400/DB2数据库,执行UPDATE语句提交时遇到SQL7008错误,代码如下:
class CDP_ODBC(): def __init__(self): self.cnxn = pyodbc.connect( 'DRIVER={iSeries Access ODBC Driver};' 'SYSTEM=192.XXX.XXX.XXX;' 'UID=UID;' 'PWD=PWD;') self.cursor = self.cnxn.cursor() def update(self): sqlstr = f""" UPDATE TABLE.DATABASE SET TESTMODELL = 1 WHERE TESTID= 1 """ self.cursor.execute(sqlstr) self.cnxn.commit()
错误信息:
(<class 'pyodbc.Error'>, Error('HY000', '[HY000] [IBM][System i Access ODBC Driver][DB2 for i5/OS]SQL7008 - TABLE in DATABASE not valid for operation. (-7008) (SQLExecDirectW)'), <traceback object at 0x0C947A88>)
已尝试添加连接参数TXNISOLATION=0;并设置self.cnxn.autocommit=False,问题依旧。
解决思路
检查表的日志记录(Journaling)状态
SQL7008最常见原因是目标表未启用journaling。AS400/DB2 for i要求表必须关联journal才能执行修改操作(UPDATE/INSERT/DELETE),尤其是事务提交模式下。需联系AS400管理员完成以下操作:- 创建journal receiver:
CRTJRNRCV JRNRCV(LIB/JRNRCV01) - 创建journal:
CRTJRN JRN(LIB/JRN) JRNRCV(LIB/JRNRCV01) - 将表关联到journal:
STRJRNPF FILE(LIB/TABLE) JRN(LIB/JRN)
- 创建journal receiver:
修正SQL语句中的库/表名顺序
AS400对象命名规范为库名.表名,你的SQL语句中TABLE.DATABASE大概率是库和表顺序颠倒,应改为DATABASE.TABLE:sqlstr = f""" UPDATE DATABASE.TABLE SET TESTMODELL = 1 WHERE TESTID= 1 """ 同时注意AS400对象名默认大写,确保库名、表名、字段名与系统实际存在的一致,必要时用双引号包裹(如`"DATABASE"."TABLE"`)。验证用户权限
确认连接使用的UID拥有目标表的UPDATE权限。可通过AS400的DSPOBJAUT命令检查权限,或执行GRANT UPDATE ON TABLE DATABASE.TABLE TO USER UID赋予权限。调整连接参数
尝试修改事务隔离级别为读已提交(TXNISOLATION=1),或开启自动提交模式测试:self.cnxn = pyodbc.connect( 'DRIVER={iSeries Access ODBC Driver};' 'SYSTEM=192.XXX.XXX.XXX;' 'UID=UID;' 'PWD=PWD;' 'TXNISOLATION=1;' 'AUTOCOMMIT=1;' )注意:开启AUTOCOMMIT后无需手动调用
self.cnxn.commit()。
内容的提问来源于stack exchange,提问作者Lukas Fürst
相关产品推荐
相关产品推荐

