Проблемы с передачей строки Python в SQL-запрос

У меня возникли проблемы с передачей моего SQL-запроса, сделанного на Python, в MS SQL.

Говорили о получении некоторого кода через pyodbc, его редактировании с помощью регулярных выражений и передаче обратно в новую таблицу базы данных. Я также попробовал некоторые print()-команды, чтобы убедиться, что код работает на Python и редактируется правильно, но я не могу записать это содержимое обратно в SQL после редактирования строк.

Я пытаюсь передать строку через:

try:   
    values = ""
    for row in cursor.execute("select row1, row2 from db_table"):
        cleanheader = cleanhtml(str(row.row1))
        cleanbody = cleanhtml(str(row.row2))
        values = values + "('" + cleanheader + "','" + cleanbody + "'),"
    values[0:len(values)-1]
    values = values + ";"
    sql = "INSERT INTO db_new_table VALUES ('"+str(values)+"')"
    cursor.execute(sql)

тогда как cleanhtml() относится к моей функции регулярного выражения:

def cleanhtml(raw_html):
    cleanr = re.compile('<.*?>|&([a-z0-9]+|#[0-9]{1,6}|#x[0-9a-f]{1,6});')
    cleantext = re.sub(cleanr, '', raw_html)
    return cleantext

Кто-нибудь знает, как правильно передать эти строки в SQL?

Никогда, НИКОГДА не используйте конкатенацию строк для добавления данных в SQL-запрос. Это массивная дыра в безопасности (атака SQL Injection). Всегда используйте параметризованные запросы... github.com/mkleehammer/pyodbc/wiki/Getting-started#parameter‌​s

MatBailie 22.12.2020 12:22
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
1
821
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Похоже, вы дважды цитируете данные в блоке VALUES с одинарными кавычками. Кажется, вы тоже путаете скобки. Распечатайте запрос перед его выполнением.

sql = "INSERT INTO db_new_table VALUES ('"+str(values)+"')"

значения здесь уже указаны и в скобках.

Ответ принят как подходящий

Используйте подготовленный оператор, а не конкатенацию, которая уязвима для SQL-инъекций, путем создания вспомогательного списка (row) для добавления каждого обработанного члена кортежей, исходящих от курсора, и предпочитайте использовать executemany, а не execute как более производительный, например

row=[]
for i in cursor.execute("SELECT col1, col2 FROM db_table"):
        cleanheader = cleanhtml(str(i[0]))
        cleanbody = cleanhtml(str(i[1]))
        row.append((cleanheader,cleanbody),)        

for i in row:
        cursor.executemany('INSERT INTO db_new_table VALUES(?,?)',([i]))

con.commit()
con.close

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