Другой вариант - использовать SQL * Plus (инструмент командной строки Oracle) для запуска скрипта. Вы можете вызвать это из Python с помощью модуля subprocess
- здесь есть хорошее прохождение: http://moizmuhammad.wordpress.com/2012/01/31/run-oracle-commands-from-python-via-sql-plus/.
Для сценария типа tables.sql
(обратите внимание на преднамеренную ошибку):
CREATE TABLE foo ( x INT );
CREATE TABLER bar ( y INT );
Вы можете использовать функцию, подобную следующей:
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
- это та же строка подключения, что и для cx_Oracle
. filename
- это полный путь к сценарию (например, 'C:\temp\tables.sql'
). Функция открывает сеанс SQL Plus (с '-S', чтобы заставить замолчать его приветственное сообщение), затем помещает в очередь "@filename" для отправки ему - это скажет SQL Plus запустить скрипт.
sqlplus.communicate
отправляет команду в stdin, ожидает завершения сеанса SQL * Plus и возвращает (stdout, stderr) в виде кортежа. Вызов этой функции с tables.sql
выше даст следующий вывод:
>>> 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
Это займет немного разбора, в зависимости от того, что вы хотите вернуть остальной части вашей программы - вы можете показать весь вывод пользователю, если он интерактивный, или отсканировать слово «ОШИБКА», если вы просто хотите проверьте, все ли работает нормально.