我有以下 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)
但我不太確定如何傳遞hire_date用于更新的列值()如果first_name已經存在的行
我是否將資料陣列中的另外 3 個元組與最終更新的值一起傳遞?
我在網上找不到任何特定資源以滿足我的需要,因此將不勝感激。
uj5u.com熱心網友回復:
您可以將EXCLUDED表限定符添加到列名:
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)
uj5u.com熱心網友回復:
因為在 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()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/482497.html
