передача dict в параметры курсора MySQL - PullRequest
0 голосов
/ 29 июня 2019

При создании запроса MySQL в Python изначально я использовал форматирование в стиле Python3:

db_data={
"column1" : 'value01',
"column2" : 5,
"column3" : None
}

columns = db_data.keys()
values = db_data.values()

query = "INSERT INTO {0:s} ({1:s}) VALUES ({2:s})".format(tablename, ', '.join(map(str, columns)), ','.join(map(repr, values)))
cursor.execute(query) 

Что небезопасно и уязвимо для инъекций, но я мог бы легко передать словарь с x количеством элементов в форме столбца: значение. К сожалению, с этим, небезопасным методом я не смог пройти «Нет», и я получил

Something went wrong: 1054 (42S22): Unknown column 'None' in 'field list'

Итак, я попробовал безопасный подход с параметрами курсора:

safe_query = "INSERT INTO %s (%s) VALUES (%s)"
cursor.execute(safe_query, (tablename, ', '.join(map(repr, columns)), ', '.join(map(repr, values))) )

Но похоже, что MySQL не любит такое форматирование:

Something went wrong: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''mytable' ('\'column1\', \'column2\', \'column3\'') VALUES ('\'value01\', ' at line 1

Я также пытался передать join (map (repr, columns)) как join (map (str, columns)), но это не помогло.

Как правильно подходить к нему, сохраняя при этом возможность выдвигать словари разного размера, как я привык к стилю форматирования python3?

...