Python UpSert - 参数不足

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 注入?

GMB*_*GMB 6

我建议使用子句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)