Aji*_*ity 3 python mysql sql sql-update sql-insert
今天这有点令人沮丧。我确信我忽略了一些简单的事情。请参阅下面的代码(为了示例而简化):
def dbUpsert(sqlQuery, sqlValues):
# Connect to the database
connection = pymysql.connect(host='localhost',
user='db_user',
password='###',
db='garden',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor)
try:
with connection.cursor() as cursor:
# Create a new record
cursor.execute(sqlQuery, sqlValues)
# Commit the changes
connection.commit()
finally:
connection.close()
sqlValues = real_plants, datetime.datetime.today().strftime('%Y-%m-%d'), 10
print (sqlValues)
##### Output: ('roses', '2020-02-19', 10)
sqlQuery = """
INSERT INTO summ_plants_day
(
real_plants, d_date, acc_plants
)
VALUES (%s, %s, %s)
ON DUPLICATE KEY UPDATE
real_plants = %s,
d_date = %s,
acc_plants = %s
"""
dbUpsert(sqlQuery, sqlValues)
Run Code Online (Sandbox Code Playgroud)
在我的数据库中,我有 4 列。一个是自增主键,real_plants一起d_date组成索引,并且acc_plants是我要更新/插入的值。
如果表roses中存在“我想要”summ_plants_day的条目,否则“我想要” 。d_dateUPDATEINSERT
这是错误:
Traceback (most recent call last):
in dbUpsert
cursor.execute(sqlQuery, sqlValues)
in execute
query = self.mogrify(query, args)
in mogrify
query = query % self._escape_args(args, conn)
TypeError: not enough arguments for format string
Run Code Online (Sandbox Code Playgroud)
另外,我使用的%s是基于 W3Schools 的示例。我在 Google 搜索我的问题时在网上看到了相互冲突的信息,这种正确/现代的格式是否可以防止 SQL 注入?
我建议使用子句VALUES()中的语法ON DUPLICATE KEY UPDATE。这避免了两次传递相同变量的需要,因此它应该可以与您现有的代码一起正常工作:
INSERT INTO summ_plants_day (real_plants, d_date, acc_plants)
VALUES (%s, %s, %s)
ON DUPLICATE KEY UPDATE
real_plants = VALUES(real_plants),
d_date = VALUES(d_date),
acc_plants = VALUES(acc_plants)
Run Code Online (Sandbox Code Playgroud)