Python UpSert - недостаточно аргументов - PullRequest
2 голосов
/ 20 февраля 2020

Сегодня это немного расстраивает. Я уверен, что это что-то простое, что я пропускаю. Смотрите код ниже (упрощенно, например, ради):

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)

В моей базе данных у меня есть 4 столбца. Одним из них является первичный ключ с автоинкрементом, real_plants и d_date вместе образуют индекс, а acc_plants - это значение, которое я хочу обновить / вставить.

Если в roses существует запись в Таблица summ_plants_day для d_date Я хочу UPDATE, в противном случае я хочу INSERT.

Вот ошибка:

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

Также я использовал %s на основе примеров W3Schools. Я обнаружил противоречивую информацию в Интернете, пока гуглил мою проблему, это правильный / современный формат для защиты от SQL инъекции?

1 Ответ

4 голосов
/ 20 февраля 2020

Я бы предложил использовать синтаксис 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...