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

Dja*_*ang 0 sqlite python-2.7

我在 Windows 7 中使用 python 2.7。

我编写了一个程序将从文本文件读取的一些数据插入到 SQLite3 数据库中。

但是,我发现插入了重复的数据,因为文本文件中存在重复的数据:

1A

2A

3A

4A

5乙

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
Run Code Online (Sandbox Code Playgroud)

我想将结果表更改为:

1A

2乙

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

MrG*_*ble 5

这取决于您想对“避免重复”施加多少限制。严格来说,您可以通过向表添加约束来避免任何重复:

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
);
Run Code Online (Sandbox Code Playgroud)

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

INSERT OR REPLACE INTO MAIN (...) VALUES (...)
Run Code Online (Sandbox Code Playgroud)

https://sqlite.org/lang.html