Python SQLite3 executemany: запрос, имитирующий set (data) - set (initial_data) - PullRequest
1 голос
/ 05 ноября 2019

Предположим, у меня есть некоторые данные в БД Sqlite3, которые вставляются путем выполнения executemany() из модуля sqlite3 Python.

Пример initial_data:

initial_data = [
    ('aa', 'test1', 'home1'),
    ('aa', 'test2', 'home2'),
    ('aa', 'test3', 'home3'),
    ('aa', 'test4', 'home4'),
    ('aa', 'test5', 'home5'),
]

Пример executemany():

self.db.executemany("""
    INSERT INTO some_table (
        col1,
        col2,
        col3
    )
    VALUES (?, ?, ?)
""", data)

После добавления вышеупомянутого initial_data в таблицу у меня может появиться новый набор data, который выглядит следующим образом:

data = [
    ('aa', 'test1', 'home1'),
    ('aa', 'test2', 'home2'),
    ('aa', 'test3', 'home3'),
    ('aa', 'test6', 'home6'),  // this is new
    ('aa', 'test4', 'home4'),
    ('aa', 'test5', 'home5'),
]

Как у вас естьвероятно, заметил, что в data есть новая строка, которая должна быть вставлена ​​в мою таблицу.

Теперь я знаю, что могу сделать что-то вроде set(data) - set(initial_data) (если len(data) > len(initial_data)) и просто вставить это в свою таблицу, но мне было интересно, могу ли я каким-то образом изменить свой запрос, чтобы я мог сделатьэто прямо из SQL. У кого-нибудь есть идеи по этому поводу?

PS: Не знаю, если это имеет значение, но len(data) всегда будет 30k-50k.

1 Ответ

1 голос
/ 05 ноября 2019

Вы можете попробовать с помощью INSERT IGNORE query.

self.db.executemany("""
    INSERT IGNORE INTO some_table (
        col1,
        col2,
        col3
    )
    VALUES (?, ?, ?)
""", data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...