如果数据存在与 executemany 则更新行

Update rows if data exists with executemany

我有以下 SQL 旨在在数据库中创建新记录或更新现有记录。

sql = """INSERT INTO table (v1, v2, v3, v4, v5, v6)
         VALUES (?, ?, ?, ?, ?, ?)
         ON CONFLICT(v5) DO UPDATE
         SET v1 = ?, v3 = ?, v6 = ?
"""

self.curr.execute(sql,(
    v1, v2, v3, v4, v5, v6,
   # below are the values for eventual update 
    v1, v3, v6)
)

这很好用,但是,我正在尝试使用 executemany() 实现批量创建行,同时保持 ON CONFLICT 逻辑。

我知道它看起来类似于:

data = [
  ('Jane', date(2005, 2, 12)),
  ('Joe', date(2006, 5, 23)),
  ('John', date(2010, 10, 3)),
]
sql = """
INSERT INTO employees (first_name, hire_date) 
VALUES (%s, %s)
ON CONFLICT(first_name) DO UPDATE
SET date = %S
"""
cursor.executemany(sql, data)

但是我不太确定如果 first_name 的行已经存在

如何传递用于更新的列值 (hire_date)

我是否将数据数组中的另外 3 个元组与最终更新的值一起传递?

我无法在网络上找到任何特定资源来满足我的需要,因此我们将不胜感激。

因为 SQL 中有三个占位符,所以需要绑定三个参数。因此,重复日期值。顺便说一下,sqlite3 使用 qmark ? 作为第一个示例中使用的占位符,并确保 commit.

data = [
    ('Jane', date(2005, 2, 12), date(2005, 2, 12)), 
    ('Joe', date(2006, 5, 23), date(2006, 5, 23)), 
    ('John', date(2010, 10, 3), date(2010, 10, 3)), 
] 

sql = """INSERT INTO employees (first_name, hire_date) 
         VALUES (?, ?) 
         ON CONFLICT(first_name) DO 
         UPDATE SET hire_date = ? 
      """

cursor.executemany(sql, data)
conn.commit()

您可以将 EXCLUDED table 限定符添加到列名称:

data = [
  ('Jane', date(2005, 2, 12)),
  ('Joe', date(2006, 5, 23)),
  ('John', date(2010, 10, 3)),
]
sql = """
INSERT INTO employees (first_name, hire_date) 
VALUES (?, ?)
ON CONFLICT(first_name) DO UPDATE
SET hire_date = EXCLUDED.hire_date
"""
cursor.executemany(sql, data)