2011-09-23 87 views

Respuesta

7

PEP-249, que cx_oracle intenta cumplir, en realidad no tiene un método como ese.

Sin embargo, el proceso debería ser bastante directo. Tire el contenido del archivo en una cadena, divídalo en el ";" carácter, y luego invocar .execute en cada miembro de la matriz resultante. Estoy asumiendo que el ";" el carácter solo se usa para delimitar las sentencias SQL de Oracle dentro del archivo.

f = open('tabledefinition.sql') 
full_sql = f.read() 
sql_commands = full_sql.split(';') 

for sql_command in sql_commands: 
    curs.execute(sql_command) 
+3

La división en ';' fallará si hay literales de cadena que contienen punto y coma; esto podría tomar un poco de escaneo simple. – 9000

+1

De acuerdo: ese fue mi punto cuando dije "Supongo que el carácter"; "solo se usa para delimitar las sentencias de SQL de Oracle dentro del archivo". Sin embargo, usted indicó el problema obvio más claramente. ¡Gracias! – chipchilders

9

Otra opción es utilizar SQL * Plus (herramienta de línea de comandos de Oracle) para ejecutar el script. Puede llamarlo desde Python usando el módulo subprocess; hay un buen tutorial aquí: http://moizmuhammad.wordpress.com/2012/01/31/run-oracle-commands-from-python-via-sql-plus/.

Para un guión como tables.sql (nótese el error deliberado):

CREATE TABLE foo (x INT); 

CREATE TABLER bar (y INT); 

Se puede utilizar una función como la siguiente:

from subprocess import Popen, PIPE 

def run_sql_script(connstr, filename): 
    sqlplus = Popen(['sqlplus','-S', connstr], stdin=PIPE, stdout=PIPE, stderr=PIPE) 
    sqlplus.stdin.write('@'+filename) 
    return sqlplus.communicate() 

connstr es la misma cadena de conexión utilizada para cx_Oracle. filename es la ruta completa al script (por ejemplo, 'C:\temp\tables.sql'). La función abre una sesión de SQL Plus (con '-S' para silenciar su mensaje de bienvenida), luego pone en cola "@filename" para enviarlo; esto le indicará a SQL Plus que ejecute el script.

sqlplus.communicate envía el comando a stdin, espera a que finalice la sesión SQL * Plus, luego devuelve (stdout, stderr) como una tupla. Llamar a esta función con tables.sql anterior dará el siguiente resultado:

>>> output, error = run_sql_script(connstr, r'C:\temp\tables.sql') 
>>> print output 

Table created. 

CREATE TABLER bar (
     * 
ERROR at line 1: 
ORA-00901: invalid CREATE command 

>>> print error 

Esto tomará un poco de análisis, dependiendo de lo que desea devolver al resto de su programa - se puede mostrar toda la salida al usuario si es interactivo o escanea la palabra "ERROR" si solo quieres comprobar si se ejecutó correctamente.

+0

la respuesta aceptada no funciona en el caso de PL/SQL ... este bit sqlplus funciona bien en ese caso. –

Cuestiones relacionadas