В 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 '\'';"""