-1

以下のコードでは、DB に実際に表示される唯一のコミットは、最後に見つかった「idn」です。idn は、顧客ごとにいくつのセット トップ ボックスがあるかをカウントするための識別番号です。したがって、idn 1、2、および 3 がすべて存在する場合、1、2、および 3 を正しくする必要がある場合にのみ、DB に 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()
4

1 に答える 1

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|。1 行だけが書き込まれているわけではありません。各行がその前の行を置き換えているため、最終的には、最後に書いた行だけが残ります。


行を更新しようとしていた場合は、次の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||

2 つの別々の行を作成しようとしていた場合は、スキーマの設定が間違っています。cid同じcid. その場合、5 つの列すべてのセットをキーにしたいのではないでしょうか?

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 に答える