У меня возникли проблемы с передачей моего 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?
Похоже, вы дважды цитируете данные в блоке 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
Никогда, НИКОГДА не используйте конкатенацию строк для добавления данных в SQL-запрос. Это массивная дыра в безопасности (атака SQL Injection). Всегда используйте параметризованные запросы... github.com/mkleehammer/pyodbc/wiki/Getting-started#parameters