¿Hay alguna manera de ejecutar un archivo de script sql usando cx_oracle en python?ejecutar un archivo de script sql desde cx_oracle?
Necesito ejecutar mis scripts de creación de tablas en archivos sql.
¿Hay alguna manera de ejecutar un archivo de script sql usando cx_oracle en python?ejecutar un archivo de script sql desde cx_oracle?
Necesito ejecutar mis scripts de creación de tablas en archivos sql.
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)
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.
la respuesta aceptada no funciona en el caso de PL/SQL ... este bit sqlplus funciona bien en ese caso. –
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
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