假设我在 Sqlite3 DB 中有一些数据,这些数据是通过从 Python 的 sqlite3
模块执行 executemany()
插入的。
示例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)
的事情(if len(data) > len(initial_data)
)并插入到我的表中,但我想知道是否可以以某种方式改变我的查询,以便我可以直接从 SQL 执行此操作。有人对此有什么想法吗?
PS:不知道是否重要,但 len(data)
将始终为 30k-50k。
最佳答案
您可以尝试使用INSERT IGNORE查询。
self.db.executemany("""
INSERT IGNORE INTO some_table (
col1,
col2,
col3
)
VALUES (?, ?, ?)
""", data)
关于Python SQLite3执行许多: query that simulates set(data) - set(initial_data),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58711959/