Es allí una manera de ejecutar un archivo de script de sql usando cx_oracle en python.

Necesito ejecutar mi crear la tabla de secuencias de comandos en el archivo sql.

OriginalEl autor | 2011-09-23

2 Comentarios

  1. 7

    PEP-249, que cx_oracle intenta ser compatible con, en realidad no tiene un método así.

    Sin embargo, el proceso debe ser bastante recta hacia adelante. Tire el contenido del archivo en una cadena, que se dividió en el «;» de caracteres, y luego llamar .ejecutar en cada uno de los miembros de la matriz resultante. Estoy suponiendo que el «;» carácter es sólo utilizado para delimitar las instrucciones 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)
    La división en ; fallará si hay literales de cadena que contiene el punto y coma; esto puede tomar un poco de análisis simple.
    De acuerdo – que fue mi punto cuando me dijo «yo estoy suponiendo que el «;» carácter es sólo utilizado para delimitar las instrucciones SQL de oracle dentro del archivo.» Se indicó que la cuestión obvia, más claramente, aunque. Gracias!
    También se supone que el sólo delimitador es ;. Que es el caso, pero si la secuencia de comandos sql contiene cosas como procedimientos almacenados, a continuación, el delimitador que se cambia antes de definir el procedimiento de…

    OriginalEl autor chipchilders

  2. 10

    Otra opción es el uso de SQL*Plus (Oracle herramienta de línea de comandos) para ejecutar la secuencia de comandos. Usted puede llamar a esto de Python usando el subprocess módulo – hay un buen tutorial aquí: http://moizmuhammad.wordpress.com/2012/01/31/run-oracle-commands-from-python-via-sql-plus/.

    Para una secuencia de comandos como tables.sql (nota el error deliberado):

    CREATE TABLE foo ( x INT );
    
    CREATE TABLER bar ( y INT );

    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 de acceso completa a la secuencia de comandos (por ejemplo,'C:\temp\tables.sql'). La función se abre un SQLAdemás de la sesión (con ‘S’ para silenciar su mensaje de bienvenida), entonces las colas «@nombre de archivo» para enviar a ella – esto va a decirle a SQLPlus para ejecutar la secuencia de comandos.

    sqlplus.communicate envía el comando a la entrada estándar stdin, espera a que el SQL*Plus sesión para terminar, a continuación, devuelve (stdout, stderr) como una tupla. Llamar a esta función con tables.sql arriba le da 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 usted desea regresar a el resto de su programa, podría mostrar el conjunto de salida para el usuario si es interactivo, o buscar la palabra «ERROR» si sólo desea comprobar si funcionaba bien.

    el aceptó la respuesta no funciona en el caso de PL/SQL .. esta sqlplus poco ¿ok en ese caso.

    OriginalEl autor Neil Vass

Dejar respuesta

Please enter your comment!
Please enter your name here