Как процитировать строку в Python, используя "mysql.connector"

Я новичок в python и пишу скрипт, который читает файл json, выполняет некоторую обработку и генерирует операторы SQL, которые в конце концов записываются в файл sql. я использую mysql.connector на python 3.6 создать соединение.

Из этого объекта подключения мне нужно процитировать параметры, которые связаны с SQL. Я не выполняю SQL из python, иначе сам Python справился бы с этим.

Кроме того, я напрямую не использую одинарные / двойные кавычки, так как мое значение может содержать эти кавычки, и sql сломается. Кроме того, существует много символов, которые необходимо заключить в кавычки, поэтому не можете быть уверены после замены только одного символа (скажем, одиночной кавычки).

Образец кода:

import mysql.connector
con = mysql.connector.connect(user=user, password=pwd, database=database, host=host)
sql = "INSERT INTO customer_data VALUES "

values = "(default, %s, %s, %s);" % (
            cust_record["name"],
            cust_record["address"],
            comment["date"]
            )

fh.write("%s %s\n" % (sql, values))

Он пишет строку так, как она есть при создании оператора вставки, я избегал вводить одинарные кавычки.

Я также попробовал это на консоли для тестирования:

name = 'kam\al'
str = ("my name is %s" % name)
con.converter.escape(str)

Это дает: 'my name is kam\x07l'без цитирования имени строки. То же самое в Perl может быть достигнуто с помощью метода котировки Perl DBI.

1 ответ

обновленный

Ты можешь использовать convert_to_mysql() если вы хотите оба, и создайте соединение по-другому. Вот пример (Python 3.6):

import _mysql_connector
ccnx.connect(user='abc', database='xyz', password='def')
params = ('sdgs\adsgsdg', 'sdgs^&%"', "sdgsdg'") 
print(ccnx.convert_to_mysql(*params)) 

Будет выводить:

(b"'sdgs\x07dsgsdg'", b'\'sdgs^&%\\"\'', b"'sdgsdg\\''")

Они уже процитированы и сбежали. Обратите внимание, что они являются байтами (python 3), поэтому вам может потребоваться преобразовать их в str (зависит от вашей версии Python.

Смотрите: _mysql_connector.MySQL.convert_to_mysql () Метод

Старый ответ

Не создавайте запросы таким образом, вы можете открыть себя для SQL-инъекций и других проблем.

Используйте подготовленные заявления, пусть водитель сделает за вас цитаты, например:

stmt = "INSERT INTO names (name) VALUES (%s)"
name = "Some name' who cares"

cursor.execute(stmt, (name,))

Для получения дополнительной информации см.: Вставка данных с помощью Connector/Python

Другие вопросы по тегам