2011-09-23 22 views

risposta

7

PEP-249, che cx_oracle tenta di essere conforme, in realtà non ha un metodo del genere.

Tuttavia, il processo dovrebbe essere abbastanza semplice. Tirare il contenuto del file in una stringa, dividerlo sul ";" carattere, quindi chiama .execute su ciascun membro dell'array risultante. Suppongo che il ";" carattere è usato solo per delimitare le istruzioni Oracle Oracle all'interno del file.

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 divisione su ';' fallirà se ci sono letterali stringa che contengono punti e virgola; questo potrebbe richiedere un po 'di semplice scansione. – 9000

+1

D'accordo - questo era il mio punto quando ho detto "Suppongo che il carattere"; "sia usato solo per delimitare le istruzioni Oracle Oracle all'interno del file." Hai comunque affermato chiaramente il problema ovvio. Grazie! – chipchilders

9

Un'altra opzione è utilizzare SQL * Plus (strumento della riga di comando di Oracle) per eseguire lo script. Puoi chiamarlo da Python usando il modulo subprocess: qui c'è una buona soluzione: http://moizmuhammad.wordpress.com/2012/01/31/run-oracle-commands-from-python-via-sql-plus/.

Per uno script come tables.sql (notare l'errore intenzionale):

CREATE TABLE foo (x INT); 

CREATE TABLER bar (y INT); 

È possibile utilizzare una funzione come la seguente:

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 è la stessa stringa di connessione utilizzata per cx_Oracle. filename è il percorso completo dello script (ad esempio 'C:\temp\tables.sql'). La funzione apre una sessione SQL Plus (con '-S' per silenziare il suo messaggio di benvenuto), quindi mette in coda "@filename" per inviarlo - questo dirà a SQL Plus per eseguire lo script.

sqlplus.communicate invia il comando a stdin, attende che la sessione SQL * Plus termini, quindi restituisce (stdout, stderr) come una tupla. Chiamando questa funzione con tables.sql sopra darà il seguente risultato:

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

questo richiederà un po 'di analisi, a seconda di ciò che si vuole tornare al resto del programma - si poteva mostrare l'intero output per l'utente, se è interattivo, o cerca la parola "ERRORE" se vuoi solo controllare se è andato bene.

+0

la risposta accettata non funziona nel caso di PL/SQL .. questo bit sqlplus in questo caso va bene. –

Problemi correlati