【发布时间】:2020-03-01 20:43:19
【问题描述】:
假设我在一个 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)(如果len(data) > len(initial_data))之类的操作并将其插入我的表中,但我想知道是否可以以某种方式更改我的查询,以便我可以直接从SQL。有人对此有任何想法吗?
PS:不知道是否重要,但len(data) 将永远是 30k-50k。
【问题讨论】:
-
如果您有主键,您可以使用合并或更新插入查询。只有当确实需要更新时,更新才需要时间
-
假设您的表有一个可以捕获这些重复项的主键或唯一约束,
INSERT OR IGNORE应该可以解决问题。见sqlite.org/lang_insert.html
标签: python sql python-2.7 sqlite