pythonpyodbcnetezza

Execute SQL file with multiple statements separated by ";" using pyodbc


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.


Solution

  • 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:

    import os
    import pyodbc
    
    print ("Connecting via ODBC")
    
    conn = pyodbc.connect('DSN=dsn', autocommit=True)
    
    print ("Connected!\n")
    
    inputdir = 'C:\\path'
    
    for script in os.listdir(inputdir):
        with open(inputdir+'\\' + script,'r') as inserts:
            sqlScript = inserts.readlines()
            for statement in sqlScript.split(';'):
                with conn.cursor() as cur:
                    cur.execute(statement)
        print(script)
    
    conn.close()
    

    The with conn.cursor() as cur: opens a closes a cursor for each statement, exiting appropriately after each call is completed.