如果数据存在与 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)
我有以下 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)