Teradatasql Python模块批量插入未触发唯一键重复错误问题
Teradata批量插入唯一约束不报错?这么改就行
你遇到的问题是因为Teradata默认在批量操作时,会跳过违反唯一约束的行继续执行,不会主动抛出错误。要让代码触发重复键异常,按下面的方法修改:
两种解决办法
方法1:修改会话全局设置
在执行插入前,先设置会话的约束错误处理行为为“遇到错误就终止”,这样所有后续DML操作碰到约束问题都会直接报错:
with teradatasql.connect('{"host":"whomooz","user":"guest","password":"please", "autocommit": false}') as con: with con.cursor() as cur: # 先设置会话规则:约束错误直接终止操作 cur.execute("SET SESSION CONSTRAINTS ERROR ACTION = 'ABORT';") cur.fast_executemany = True try: cur.execute("insert into voltab (?, ?)", [ [1, "abc"], [2, "def"], [3, "ghi"] ]) con.commit() except teradatasql.Error as e: con.rollback() print(f"插入失败:{e}") raise
方法2:仅针对当前插入语句生效
如果不想修改全局会话设置,可以在INSERT语句里加WITH ABORT ON CONSTRAINT ERROR子句,只让当前插入操作碰到约束错误时终止报错:
with teradatasql.connect('{"host":"whomooz","user":"guest","password":"please", "autocommit": false}') as con: with con.cursor() as cur: cur.fast_executemany = True try: # 插入语句里指定约束错误处理规则 cur.execute("insert into voltab (?, ?) WITH ABORT ON CONSTRAINT ERROR", [ [1, "abc"], [2, "def"], [3, "ghi"] ]) con.commit() except teradatasql.Error as e: con.rollback() print(f"插入失败:{e}") raise
关键说明
- 必须关闭
autocommit,否则遇到错误时部分数据可能已经提交,无法回滚。 - 两种方法都会在碰到第一个重复键时立即终止插入操作,并抛出
teradatasql.Error异常,符合你要的报错需求。
内容的提问来源于stack exchange,提问作者rocks
相关产品推荐
相关产品推荐

