SQLITE3 исключить из импорта - строки данных, которые уже присутствуют в таблице - БЕЗ использования первичного ключа - PullRequest
0 голосов
/ 20 апреля 2020

Цель

Я хочу получить базу данных sqlite3, в которой нет дублирующихся строк без первичного ключа. Я хочу иметь возможность запускать свой сценарий несколько раз, но при этом не импортировать одни и те же данные в мою базу данных, если она уже существует.

Проблема

Текущая настройка базы данных будет импортировать данные даже если эти же данные уже присутствуют в базе данных (из более раннего импорта).

Пример данных - file.tsv

client1 account1    platform1   2020-04-05  44  advertiser1 5272
client1 account1    platform1   2020-04-06  44  advertiser1 10251
client1 account1    platform1   2020-04-07  44  advertiser1 14176
client2 account1    platform2   2020-04-05  44  advertiser1 5272
client2 account1    platform2   2020-04-06  44  advertiser1 10251
client2 account1    platform2   2020-04-07  44  advertiser1 14176

Код

sqlite3 -batch database.db <<EOF
CREATE TABLE IF NOT EXISTS clientdata_advertiser(
Client  TEXT,
Account TEXT,
Platform    TEXT,
Date_Delivered  DATE,
Advertiser_ID   INTEGER,
Advertiser  TEXT,
Impressions INTEGER
);

CREATE TEMPORARY TABLE wand(
Client  TEXT,
Account TEXT,
Platform    TEXT,
Date_Delivered  DATE,
Advertiser_ID   INTEGER,
Advertiser  TEXT,
Impressions INTEGER
);

.mode tabs
.separator \t
.import file.tsv wand

INSERT INTO clientdata_advertiser (Client, Account, Platform, Date_Delivered, Advertiser_ID, Advertiser, Impressions)
SELECT
    CAST (Client AS TEXT),
    CAST (Account AS TEXT),
    CAST (Platform AS TEXT),
    strftime('%Y-%m-%d',Date_Delivered),
    CAST (Advertiser_ID AS Integer),
    CAST (Advertiser AS TEXT),
    CAST (Impressions AS Integer)
FROM wand;
EOF

Текущий вывод код запускается 2x

sqlite> .headers on
sqlite> select * from clientdata_advertiser ;
Client|Account|Platform|Date_Delivered|Advertiser_ID|Advertiser|Impressions
client1|account1|platform1|2020-04-05|44|advertiser1|5272
client1|account1|platform1|2020-04-06|44|advertiser1|10251
client1|account1|platform1|2020-04-07|44|advertiser1|14176
client2|account1|platform2|2020-04-05|44|advertiser1|5272
client2|account1|platform2|2020-04-06|44|advertiser1|10251
client2|account1|platform2|2020-04-07|44|advertiser1|14176
client1|account1|platform1|2020-04-05|44|advertiser1|5272
client1|account1|platform1|2020-04-06|44|advertiser1|10251
client1|account1|platform1|2020-04-07|44|advertiser1|14176
client2|account1|platform2|2020-04-05|44|advertiser1|5272
client2|account1|platform2|2020-04-06|44|advertiser1|10251
client2|account1|platform2|2020-04-07|44|advertiser1|14176

Требуемый вывод, если код запускается 2x

sqlite> .headers on
sqlite> select * from clientdata_advertiser ;
Client|Account|Platform|Date_Delivered|Advertiser_ID|Advertiser|Impressions
client1|account1|platform1|2020-04-05|44|advertiser1|5272
client1|account1|platform1|2020-04-06|44|advertiser1|10251
client1|account1|platform1|2020-04-07|44|advertiser1|14176
client2|account1|platform2|2020-04-05|44|advertiser1|5272
client2|account1|platform2|2020-04-06|44|advertiser1|10251
client2|account1|platform2|2020-04-07|44|advertiser1|14176

То, что я пробовал

Я пробовал различные способы, возможно, делать это когда данные находятся в таблицах, но, похоже, не смогли заставить их работать. Я подозреваю, что лучший способ - убедиться, что строки не будут импортированы в таблицу, если они уже есть, но я не смог выяснить в Интернете, как я мог бы сделать это, не имея первичного ключа - который мой набор данных не содержит. Буду признателен за любые отзывы или предложения.

1 Ответ

0 голосов
/ 20 апреля 2020
sqlite3 -batch database.db <<EOF
CREATE TABLE IF NOT EXISTS clientdata_advertiser(
Client  TEXT,
Account TEXT,
Platform    TEXT,
Date_Delivered  DATE,
Advertiser_ID   INTEGER,
Advertiser  TEXT,
Impressions INTEGER,
UNIQUE(Client,Account,Platform,Date_Delivered,Advertiser_ID,Advertiser,Impressions) ##UNIQUE creates restrictions to ensure no row is the same based on all the columns defined
);

CREATE TEMPORARY TABLE wand(
Client  TEXT,
Account TEXT,
Platform    TEXT,
Date_Delivered  DATE,
Advertiser_ID   INTEGER,
Advertiser  TEXT,
Impressions INTEGER
);

.mode tabs
.separator \t
.import file.tsv wand

INSERT OR IGNORE INTO clientdata_advertiser (Client, Account, Platform, Date_Delivered, Advertiser_ID, Advertiser, Impressions) ##INSERT OR IGNORE used to make sure the script doesn't blow up when there is a conflict with the UNIQUE statement.
SELECT
    CAST (Client AS TEXT),
    CAST (Account AS TEXT),
    CAST (Platform AS TEXT),
    strftime('%Y-%m-%d',Date_Delivered),
    CAST (Advertiser_ID AS Integer),
    CAST (Advertiser AS TEXT),
    CAST (Impressions AS Integer)
FROM wand;
EOF
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...