C'è un modo per eseguire un file di script sql usando cx_oracle in python.esegue un file di script sql da cx_oracle?
Ho bisogno di eseguire i miei script di creazione tabelle in file sql.
C'è un modo per eseguire un file di script sql usando cx_oracle in python.esegue un file di script sql da cx_oracle?
Ho bisogno di eseguire i miei script di creazione tabelle in file sql.
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)
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.
la risposta accettata non funziona nel caso di PL/SQL .. questo bit sqlplus in questo caso va bene. –
La divisione su ';' fallirà se ci sono letterali stringa che contengono punti e virgola; questo potrebbe richiedere un po 'di semplice scansione. – 9000
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