(制限をかけると、CSVファイルそのものが読み込まれないという理解です。)
この理解は間違っています。CSVのインポート時に重複を除くためにUNIQUE制約をつけて下さい。
例えば下記のようなスキーマのデータベースを作成します。
sql
1CREATE TABLE hoge(
2 date TEXT,
3 type TEXT,
4 value INT,
5 UNIQUE(date,type,value)
6);
terminal
1$ sqlite3 test.db < init.sql
次の2つのCSVをインポートしてみます。1つは予め重複のあるCSV、もう一つは既に存在するレコードを持つCSVです。
test1.csv
CSV
12020-06-12,A,1
22020-06-12,A,1
32020-06-13,B,5
42020-06-14,C,3
test2.csv
CSV
12020-06-13,B,5
22020-06-17,D,3
この状態でインポートしてみます。
terminal
1$ sqlite3 -separator , test.db ".import test1.csv hoge"
2test1.csv:2: INSERT failed: UNIQUE constraint failed: hoge.date, hoge.type, hoge.value
警告が表示されましたがデータベースの中身を見てみると
terminal
1$ sqlite3 test.db "SELECT * FROM hoge"
22020-06-12|A|1
32020-06-13|B|5
42020-06-14|C|3
と正しく重複が除かれたデータベースができています。続いて新しいCSVをインポートして見ます。
terminal
1$ sqlite3 -separator , test.db ".import test2.csv hoge"
2test2.csv:1: INSERT failed: UNIQUE constraint failed: hoge.date, hoge.type, hoge.value
やはり警告が表示されましたが、データベースを見てみると
terminal
1$ sqlite3 test.db "SELECT * FROM hoge"
22020-06-12|A|1
32020-06-13|B|5
42020-06-14|C|3
52020-06-17|D|3
と、新たに意図したレコードが追加されています。
pythonによる方法(回答欄での質問に対する返事)
PRIMARY KEYやUNIQUE制約を持ったテーブルに対して、pythonを使ってCSVファイルを追記する方法を示します。
重要なことはINSERT
の代わりにINSERT OR IGNORE
を用いることです。
python
1import sqlite3
2
3
4def insert_csv(conn, filename):
5 with open(filename, "r") as f:
6 items = []
7 for line in f:
8 cols = line.strip().split(",")
9 items.append(cols)
10 cur = conn.cursor()
11 cur.executemany(
12 "INSERT OR IGNORE INTO hoge (date,type,value) VALUES (?,?,?)",
13 items,
14 )
15 conn.commit()
16
17
18def main():
19 conn = sqlite3.connect("test.db")
20 insert_csv(conn, "test1.csv")
21 insert_csv(conn, "test2.csv")
22 conn.close()
23
24
25if __name__ == "__main__":
26 main()
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/12 05:52
退会済みユーザー
2020/06/12 07:53
2020/06/12 10:09
退会済みユーザー
2020/06/12 16:28