Python / sqlite - 仅提交最后一个if语句

时间:2013-11-11 21:14:24

标签: python sqlite commit

在下面的代码中,实际显示在DB中的唯一提交是找到的最后一个'idn'。 idn只是一个识别号码,可以计算每个客户有多少个机顶盒。因此,如果idn 1,2和3都存在,它只会在DB 1,2和3右边写入3。如果idn 1是唯一存在的,那么它就会被写入。谢谢你的帮助!

    if "STBSINFO||" in line:
        head, sep, tail = line.partition('STBSINFO||')
        idn = idn + 1
        if "|" in tail:
            head, sep, tail = tail.partition('|')
            #Creates the mac address variable from the partition
            mac = head                                    
            if "|" in tail:
                head, sep, tail = tail.partition('|')
                #Gathers the IP of the given set top box
                stbip = head
                if idn == 1:
                    cursor.execute("INSERT OR REPLACE INTO packages (cid, mstb1) VALUES (?,?)", (cid, stbip))
                    conn.commit()
                elif idn == 2:
                    cursor.execute("INSERT OR REPLACE INTO packages (cid, mstb2) VALUES (?,?)", (cid, stbip))
                    conn.commit()
                elif idn == 3:
                    cursor.execute("INSERT OR REPLACE INTO packages (cid, mstb3) VALUES (?,?)", (cid, stbip))
                    conn.commit()
                elif idn == 4:
                    cursor.execute("INSERT OR REPLACE INTO packages (cid, mstb4) VALUES (?,?)", (cid, stbip))
                    conn.commit()

1 个答案:

答案 0 :(得分:0)

如果cid是主键,或者对其有一些其他唯一性约束(如示例中所示),则不能有多个具有相同cid的行。因此,当您INSERT OR REPLACE行与前一行具有相同的cid时,它将只替换上一行。

例如:

sqlite> CREATE TABLE packages (cid PRIMARY KEY, mstb1, mstb2, mstb3, mstb4);
sqlite> INSERT INTO packages (cid, mstb1) values (1, 1);
sqlite> INSERT OR REPLACE INTO packages (cid, mstb2) values (1, 2);
sqlite> SELECT * FROM packages;
cid|mstb1|mstb2|mstb3|mstb4
1||2||

这正是您的计划中发生的事情。您插入行1|1|||,然后将其替换为行1||2||,然后将其替换为行1|||3|。并不是说只有一行被写入,而是每一行都替换了它之前的一行,所以最后,你只需要用你最后写的那一行。


如果您尝试更新该行,请使用UPDATE语句,而不是INSERT OR REPLACE

sqlite> UPDATE packages SET mstb1=1 WHERE cid=1;
sqlite> SELECT * FROM packages;
cid|mstb1|mstb2|mstb3|mstb4
1|1|2||

如果您尝试创建两个单独的行,那么您的架构设置错误;如果您想要两个具有相同cid的不同行,则cid不能是唯一键。也许您希望所有五列的集合在这种情况下成为关键?

sqlite> CREATE TABLE packages (cid NOT NULL, mstb1, mstb2, mstb3, mstb4, PRIMARY KEY(cid, mstb1, mstb2, mstb3, mstb4));
sqlite> INSERT INTO packages (cid, mstb1) values (1, 1);
sqlite> INSERT INTO packages (cid, mstb2) values (1, 2);
sqlite> SELECT * FROM packages;
cid|mstb1|mstb2|mstb3|mstb4
1|1|||
1||2||

INSERTON CONFLICTUPDATE上的文档更详细地解释了这些内容。

但是,我认为在参考文档很有意义之前,您需要一个关于SQL数据库的基础教程。