I am currently writing a script to run multiple SQL files using Python, a little background before you mention alternative methods; this is to automate the scripts and Python is the only tools I have on our windows 2008 server. I have a script that works for one set but the issue is when the other set has two statements instead of one seperated by a ';' here is my code:
import os
import pyodbc
print ("Connecting via ODBC")
conn = pyodbc.connect('DSN=dsn', autocommit=True)
print ("Connected!\n")
inputdir = 'C:\\path'
cursor = conn.cursor()
for script in os.listdir(inputdir):
with open(inputdir+'\\' + script,'r') as inserts:
sqlScript = inserts.readlines()
sql = (" ".join(sqlScript))
cursor.execute(sql)
print (script)
conn.close()
print ('Run Complete!')
So this code works to show the entire file but it only executes one statement before ";".
Any help would be great!
Thanks.
The API in the pyodbc connector (or pymysql) doesn't allow multiple statements in a SQL call. This is an issue of engine parsing; an API would need to completely understand the SQL that it's passing in order for multiple statements to be passed, and then multiple results handled upon return.
A slight modification to your script like the one below should allow you to send each of your statements individually with separate connectors:
The
with conn.cursor() as cur:
opens a closes a cursor for each statement, exiting appropriately after each call is completed.The more correct approach is to parse comments and quoted strings, and only consider
;
s outside of them. Or else your code will be broken immediately after you comment out several SQL statements with a block comment.Here is a state machine based implementation I made for myself - this code is probably ugly and could be written much better, so please feel free to improve it. It doesn't handle MySQL-style
#
-starting comments but it is easy to add.And use it like this: