В Python как избежать одиночной кавычки в строке, которая будет использоваться в качестве оператора SQL?

Я построил простое заявление, чтобы запустить load data local infile на таблице MySQL. Я использую Python для генерации строки, а также запускаю запрос. Поэтому я использую пакет Python pymysql,

Это строка для построения строки. Предполагать metadata_filename правильная строка:

load_data_statement = "" "загрузить данные локального файла""" + metadata_filename + """INTO TABLE table1 FIELDS TERMINATED BY ',' ENCLOSED BY '\'';"""

Первоначально у меня была подстановка строк, и я хотел посмотреть, была ли это проблема, но это не так. Если я отредактирую приведенное выше утверждение и рекомендую ENCLOSED BY частично, он может работать, но не правильно загружать данные, так как мне нужен закрытый символ

Если я print(load_data_statement)Я получаю то, что кажется правильным кодом SQL, но кажется, что он не читается соединителем SQL. Вот что напечатано:

загрузить данные локальный файл 'filename.txt' в таблицу table1 ПОЛЯ, ПРЕКРАЩЕННЫЕ BY ',' ENCLOSED BY ''';

Кажется, что все правильно, но движок Mysql его не принимает. Что я должен отредактировать в Python, чтобы избежать одиночной кавычки или просто написать это правильно?

Редактировать:

Я использовал альтернативу подстановки строк, но все еще получаю проблемы: load_data_statement = """load data local infile 'tgt_metadata_%s.txt' INTO TABLE table1 FIELDS TERMINATED BY ',' ENCLOSED BY '\'';""" % metadata_filename

Также пробовал сырые строки:load_data_statement = r"""load data local infile 'tgt_metadata_%s.txt' INTO TABLE table1 FIELDS TERMINATED BY ',' ENCLOSED BY '\'';""" % metadata_filename

Также пробовал сырые строки:load_data_statement = r"""load data local infile 'tgt_metadata_%s.txt' INTO TABLE table1 FIELDS TERMINATED BY ',' ENCLOSED BY '\'';""" % metadata_filename

И попытался добавить дополнительные экранирования: Также попробовал сырые строки:load_data_statement = r"""load data local infile 'tgt_metadata_%s.txt' INTO TABLE table1 FIELDS TERMINATED BY ',' ENCLOSED BY '\\'';""" % metadata_filename

Также пробовал сырые строки:load_data_statement = r"""load data local infile \'tgt_metadata_%s.txt\' INTO TABLE table1 FIELDS TERMINATED BY ',' ENCLOSED BY '\'';""" % metadata_filename

Строка выполнения проста: cur.execute (load_data_statement)

И ошибка, которую я получаю, является странной: `pymysql.err.ProgrammingError: (1064, " У вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, для правильного синтаксиса, чтобы использовать около 'tgt_metadta_mal.txt'.txt'В таблицу tgt_metadata ПОЛЯ, ПРЕКРАЩЕННЫЕ','; ENC' в строке 1")

Я не понимаю, почему сообщение начинается с 'tgt_metadata_mal.txt и показывает только первые 3 буквы ENCLOSED BY...

2 ответа

Нет необходимости избегать этой строки.

cursor.execute("SELECT * FROM Codes WHERE ShortCode = %s", text)

Вы должны использовать %s вместо ваших строк, а затем (в этом случае текст) будет вашей строкой. Это самый безопасный способ защиты от SQL Injection

Я думаю, что проблема с оператором SQL, который вы печатаете. Единая цитата в ''' следует экранировать: '\'', Ваша обратная косая черта выходит за кавычки на уровне Python, а не на уровне MySQL. Таким образом, строка Python должна заканчиваться ENCLOSED BY '\\'';

Вы также можете использовать необработанные строковые литеральные обозначения:r"""INTO TABLE table1 FIELDS TERMINATED BY ',' ENCLOSED BY '\'';"""

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