Python错误集锦:sqlite3插入记录提示:IntegrityError: UNIQUE constraint failed: table_juzicode._id

本文探讨了如何在Python中使用sqlite3模块时,避免因尝试插入已存在的主键(_id)而引发的IntegrityError。作者指出了主键自增设置的重要性,并给出了正确的插入记录方法,以确保数据一致性。
摘要由CSDN通过智能技术生成

原文链接:http://www.juzicode.com/archives/3986

错误提示:

下列代码第2次执行时,插入记录提示:IntegrityError: UNIQUE constraint failed: table_juzicode._id

#juzicode.com/vx:桔子code
import  sqlite3

#检查表是否存在,存在返回True
def check_table_exsist(cursor,table_name):
    sql = '''SELECT tbl_name FROM sqlite_master WHERE type = 'table' '''
    cursor.execute(sql)
    values = cursor.fetchall()
    tables = []
    for v in values:
        tables.append(v[0])
    print('数据库包含的表:',tables) 
    if table_name in tables:
        return True
    return False
#查询、显示
def query(cursor,table_name):
    sql = '''  SELECT _id, name, price, weight  from  ''' + table_name
    values = cursor.execute(sql)
    for v in values:
        print('----------------')
        print('_id   =',v[0])
        print('name  =',v[1])
        print('price =',v[2])
        print('weight=',v[3])    
    
db_name = 'test2.db'
table_name = 'table_juzicode'

#连接数据库,创建游标
conn = sqlite3.connect(db_name)
cursor = conn.cursor()
print(db_name +' 数据库连接成功')

#表不存在则建表
if check_table_exsist(cursor,table_name) is not True:
    sql = '''CREATE TABLE '''+table_name +''' (
        _id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT,      
        price REAL,
        weight REAL
        )'''
    cursor.execute(sql)    
    conn.commit()
    print(table_name + ' 创建成功')
else:
    print(table_name + ' 已经存在')

#增加
sql='''INSERT INTO ''' + table_name + ''' (_id,name,price,weight) \
      VALUES (1,'orange', 1.11,  100.1 )'''    
cursor.execute(sql)
sql='''INSERT INTO ''' + table_name + ''' (name,price,weight) \
      VALUES ('apple', 2.22,  200.2 )'''    
cursor.execute(sql)     
conn.commit()
query(cursor,table_name)

#关闭游标,关闭连接
cursor.close()
conn.close()
==========运行结果:
test2.db 数据库连接成功 数据库包含的表: ['table_juzicode', 'sqlite_sequence'] table_juzicode 已经存在 

--------------------------------------------------------------------------- IntegrityError                            
Traceback (most recent call last) <ipython-input-10-424fbaac2126> in <module>
      49 sql='''INSERT INTO ''' + table_name + ''' (_id,name,price,weight) \
      50       VALUES (1,'orange', 1.11,  100.1 )'''
     ---> 51 cursor.execute(sql)
      52 sql='''INSERT INTO ''' + table_name + ''' (name,price,weight) \
      53       VALUES ('apple', 2.22,  200.2 )'''
     IntegrityError: UNIQUE constraint failed: table_juzicode._id

 

错误原因:

1、建表时 _id字段是主键必须唯一:_id INTEGER PRIMARY KEY AUTOINCREMENT,当上述程序第1次执行时已经写入了_id=1的记录,第2次执行时_id=1的记录因为已经存在,所以再次插入就会导致IntegrityError

 

解决方法:

1、因为是自增型的类型,可以不必指定_id插入记录:

#增加
sql='''INSERT INTO ''' + table_name + ''' (name,price,weight) \
      VALUES ('orange', 1.11,  100.1 )'''  #去掉_id字段插入  
cursor.execute(sql)
sql='''INSERT INTO ''' + table_name + ''' (name,price,weight) \
      VALUES ('apple', 2.22,  200.2 )'''    
cursor.execute(sql)     
conn.commit()
query(cursor,table_name)

 

扩展内容:

  1. Python进阶教程m12–sqlite3模块
SQLite `IntegrityError` with the message "UNIQUE constraint failed: t_icbc_record.id"通常表示试图插入的数据违反了表`t_icbc_record`中的唯一性约束,即id字段已经有了一条相同的记录。这通常是由于尝试插入重复的ID,或者在未设置默认值的情况下插入NULL值,而该字段有一个NOT NULL约束。 解决这个问题的方法取决于具体的应用场景: 1. **检查并更新数据**: 确认你在尝试插入ID是否已经存在于数据库中。如果是,则可能需要更新已存在的记录,而不是插入新的。如果数据是从其他地方导入的,可能需要在导入时做去重处理。 2. **设置默认值或允许NULL**: 如果id字段不允许NULL并且你想允许这个字段有空值,可以在创建表时修改它的定义,如`id INTEGER DEFAULT NULL UNIQUE`。但请注意,如果你希望每个记录都有唯一的标识,保持NOT NULL会更合适。 3. **程序逻辑错误**: 检查你的应用程序代码,在插入记录之前是否正确设置了id值。可能是某个地方意外地清除了id值,或者是并发处理导致了ID冲突。 ```python # 示例(假设使用ORM): try: record = t_icbc_record.objects.create(id=your_unique_id) except IntegrityError as e: # 处理重复ID的情况,如更新现有记录或抛出异常 if "UNIQUE constraint failed" in str(e): existing_record = t_icbc_record.objects.get(id=your_unique_id) record = existing_record # 更新现有记录 else: raise e # 或者直接使用SQL避免ORM自动处理: cursor.execute(""" INSERT INTO t_icbc_record (id, other_fields) VALUES (?, ?) ON CONFLICT (id) DO UPDATE SET ... """, (your_unique_id, other_values)) ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值