SQLite3列不是唯一的

时间:2016-06-22 17:17:30

标签: python database csv sqlite

我使用我编写的python脚本将一些csv文件中的数据插入到我的SQLite3数据库中。当我运行脚本时,它会将第一行插入数据库,但在尝试插入第二行时会出现此错误:

sqlite3.IntegrityError: columns column_name1, column_name2 are not unique.

在csv文件的前两行中,column_name1和column_name2中的值是相同的。但是,这对我来说似乎有点奇怪,因为阅读此错误表明它表示对一个或多个数据库列的唯一性约束。我使用SQLite Expert Personal检查了数据库详细信息,并且它没有在当前表上显示任何唯一性约束。此外,我输入的字段都没有指定主键。似乎数据库会自动分配这些。有关可能导致此错误的原因的任何想法?感谢。

import sqlite3
import csv

if __name__ == '__main__' :

conn = sqlite3.connect('ts_database.sqlite3')
c = conn.cursor()

fileName = "file_name.csv"
f = open(fileName)
csv_f = csv.reader(f)

for row in csv_f:
    command = "INSERT INTO table_name(column_name1, column_name2, column_name3)"
    command += " VALUES (%s, '%s', %s);" % (row[0],row[1],row[2])
    print command
    c.execute(command)
    conn.commit()

f.close()

2 个答案:

答案 0 :(得分:2)

如果SQLite报告了IntegrityError错误,那么很可能在这两列上确实存在PRIMARY KEY或UNIQUE KEY,并且当您声明没有时,您就错了。确保您真正查看数据库的同一实例。

另外,使用字符串插值来编写SQL语句。它是危险的,也很难纠正(因为你可能知道你在其中一个字段上有单引号)。在SQLite中使用参数化语句非常非常简单。

答案 1 :(得分:0)

错误可能是由于INSERT INTO语句中的列名重复造成的。我猜这是一个拼写错误,你的意思是INSERT INTO语句中的column_name3。