【问题标题】:Python SQLite3 executemany: query that simulates set(data) - set(initial_data)Python SQLite3 executemany:模拟 set(data) - set(initial_data) 的查询
【发布时间】: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


【解决方案1】:

您可以尝试使用 INSERT IGNORE 查询。

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

【讨论】:

    猜你喜欢
    • 2018-08-22
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 2011-02-17
    • 2012-11-09
    • 2016-04-01
    • 1970-01-01
    • 2017-10-19
    相关资源
    最近更新 更多