2016-05-09 7 views
4

У меня есть некоторые данные, хранящиеся в массиве, среди которых есть поле message, которое может содержать разные типы символов. Среди них quotes characters.Как вывести Mysql в PYTHON

import MySQLdb 
    for key, value in result_array.items(): 
      insert_array.append("`%s` = \"%s\"" %(key, value)) 
    insert_values = " , ".join(insert_array) 
    query_insert = "INSERT into `%s` SET %s ON DUPLICATE KEY UPDATE %s" %(insert_table, insert_values, insert_values) 
    cursor.execute(query_insert) 

Этот код не работает, если message содержит двойную кавычку. Как избежать этого?

P.S.

Я хочу сосредоточиться на разнице между connection.escape_string и cursor.execute(operation, params=None, multi=True) с params. Был annwer (теперь удален), который предлагал использовать connection.escape_string, а некоторые люди, которые ответили, сказали, что это не безопасно. Это связано с тем, что escape-запрос вручную может быть опасным, и лучше использовать функцию параметризации. [кто-то может быть лучше, чем у меня в объяснении этой концепции, пожалуйста, добро пожаловать, чтобы изменить эту часть]

+0

Какой модуль python вы используете для подключения к MySQL? –

+0

'MySQLdb' Обновление моего вопроса – salvob

+0

Почему * heck * Вы используете форматированную строку для SQL? Вы должны почти никогда не делать этого. Он приглашает SQL-инъекцию. – jpmc26

ответ

4

С помощью execute() вызова правильно:

data = [] 
for key, value in result_array.items(): 
    # only proper if key is NOT user defined! 
    insert_array.append("%s = %%s" % key) # results in key = %s 
    data.append(value) 
insert_values = " , ".join(insert_array) 
query_insert = "INSERT into `%s` SET %s ON DUPLICATE KEY UPDATE %s" %(insert_table, insert_values, insert_values) 
cursor.execute(query_insert, data * 2) 

не проверял, и hopfilly понял ваш код правильно.

Цель состоит в передаче реальных данных на вызов execute(), который должен сбежать от него для вас. Он делает это с помощью функций базы данных и, таким образом, делает это лучше, чем вы когда-либо могли.

+0

Благодарим вас за ответ. , но у меня есть несколько вопросов: В запросе_insert есть три '% s', а в вашем коде' execute' вы ставите второй параметр функции 'data * 2'. Как Python выяснил, где заменить эти парааметры? Вы забыли переменную 'value' в цикле? или это было специально? если да, то почему? – salvob

+0

Это похоже на правильный способ сделать это, но он может использовать некоторые объяснения. Там много чего происходит. – tadman

+0

Все, я вижу, что вы сделали, вы вставляете 'insert_array' вложенную/интеллектуальную интерполяцию, затем вы вводите в массив' data' только значения, таким образом 'execute' может понять, какие данные необходимы. большой! спасибо – salvob

Смежные вопросы