I got some issues passing my SQL query made in Python to MS SQL.
Were talking about retrieving some code via pyodbc
, editing it with regex, and passing it back into a new table of the Database.
I also tried some print()
-Commands to assure the Code is running in Python and being edited the right way, but I am not able to write those contents back to SQL after editing the strings.
Im trying to pass the string via:
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)
whereas cleanhtml()
refers to my regex-function:
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
Does anyone have an idea on how to pass those lines correctly to SQL?
Advertisement
Answer
Use a prepared statement rather than concatenation, which is vulnerable to SQL Injection, by creating an auxiliary list(row
) to append the each processed member of the tuples coming from the cursor, and prefer using executemany
rather than execute
as being more performant such as
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