-1

在下面的代码中,实际出现在数据库中的唯一提交是找到的最后一个“idn”。idn 只是一个标识号,用于计算每个客户有多少个机顶盒。因此,如果 idn 1,2 和 3 都存在,它只会在应该正确 1,2 和 3 时将 3 写入 DB。如果 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()
4

1 回答 1

0

Ifcid是一个主键,或者有一些其他的唯一性约束——就像你的例子一样——你不能有多行具有相同的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 CONFLICT和上的文档UPDATE更详细地解释了事情。

但是,我认为您需要一个关于 SQL 数据库的基本教程,然后参考文档才有意义。

于 2013-11-11T21:23:44.127 回答