使用python将数据插入SQLite3数据库时,如何避免插入重复数据?

时间:2019-08-28 05:06:42

标签: python-2.7 sqlite

我在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

如何修改代码以避免将重复的数据插入数据库?

1 个答案:

答案 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
);

在此示例中,当约束跨越多列时,我使用了“表约束”。如果要避免单个值重复,也可以使用“列约束”。 对于这两种情况,您都可以更改冲突响应,IGNOREREPLACEABORT等,取决于您希望引起的行为。这些冲突响应也可以在INSERT语句中设置为

INSERT OR REPLACE INTO MAIN (...) VALUES (...)

https://sqlite.org/lang.html