我在Windows 7中使用python 2.7。
我编写了一个程序,将从文本文件中读取的一些数据插入到SQLite3数据库中。
但是,我发现插入了重复数据,因为文本文件中有重复数据:
1 A
2 A
3 A
4 A
5 B
conn = sqlite3.connect('Static_Analysis.db')
c = conn.cursor()
c.execute('''CREATE TABLE MAIN
(
NAME TEXT NOT NULL,
Error_List CHAR(50),
Warning_List CHAR(50),
Advice_List CHAR(50),
Total CHAR(50),
Note CHAR(50));''')
c.execute('''CREATE TABLE ERROR_REPORT
(
NAME TEXT NOT NULL);''')
c.execute('''CREATE TABLE WARNING_REPORT
(
NAME TEXT NOT NULL);''')
c.execute('''CREATE TABLE ADVICE_REPORT
(
NAME TEXT NOT NULL);''')
file = open("summary.log",'r')
p1 = re.compile(r"[Error ]")
p2 = re.compile("[Warning]")
p3 = re.compile(r"[Advice ]")
i = 1
m_i = 0
n_i = 0
p_i = 0
for line in file:
if '[Error ]' in line:
str = line.split(":")
print str
conn.execute("INSERT INTO MAIN (NAME) VALUES (\"%s\")" % (str[0]
[9:]))
conn.execute("INSERT INTO ERROR_REPORT (NAME) VALUES (\"%s\")" %
(str[-1]))
elif '[Warning]' in line:
str = line.split(":")
conn.execute("INSERT INTO MAIN (NAME) VALUES (\"%s\")" % (str[0]
[9:]))
conn.execute("INSERT INTO WARNING_REPORT (NAME) VALUES (\"%s\")" %
(str[-1]))
elif '[Advice ]' in line:
p_i = p_i + 1
str = line.split(":")
conn.execute("INSERT INTO MAIN (NAME) VALUES (\"%s\")" % (str[0]
[9:]))
conn.execute("INSERT INTO ADVICE_REPORT (NAME) VALUES (\"%s\")" %
(str[-1]))
else:
i = i - 1
i = i + 1
我想将结果表更改为:
1 A
2 B
如何修改代码以避免将重复的数据插入数据库?
答案 0 :(得分:0)
这取决于您要对“避免重复”施加多少约束。 严格来说,可以通过向表中添加约束来避免任何重复:
CREATE TABLE MAIN
(
NAME TEXT NOT NULL,
Error_List CHAR(50),
Warning_List CHAR(50),
Advice_List CHAR(50),
Total CHAR(50),
Note CHAR(50),
UNIQUE (NAME, Error_List, Warning_List, Advice_List, Total, Note) ON CONFLICT IGNORE
);
在此示例中,当约束跨越多列时,我使用了“表约束”。如果要避免单个值重复,也可以使用“列约束”。
对于这两种情况,您都可以更改冲突响应,IGNORE
,REPLACE
,ABORT
等,取决于您希望引起的行为。这些冲突响应也可以在INSERT语句中设置为
INSERT OR REPLACE INTO MAIN (...) VALUES (...)