выполнить файл сценария sql из cx_oracle? - PullRequest
8 голосов
/ 23 сентября 2011

Есть ли способ выполнить файл сценария sql, используя cx_oracle в python.

Мне нужно выполнить сценарии создания моей таблицы в файлах sql.

Ответы [ 2 ]

11 голосов
/ 09 октября 2012

Другой вариант - использовать 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

Это займет немного разбора, в зависимости от того, что вы хотите вернуть остальной части вашей программы - вы можете показать весь вывод пользователю, если он интерактивный, или отсканировать слово «ОШИБКА», если вы просто хотите проверьте, все ли работает нормально.

9 голосов
/ 23 сентября 2011

PEP-249 , которому cx_oracle пытается соответствовать, на самом деле такого метода не существует.

Однако процесс должен быть довольно простым. Вытащите содержимое файла в строку, разделите его на «;» символа, а затем вызовите .execute для каждого члена результирующего массива. Я предполагаю, что ";" символ используется только для разделения операторов SQL оракула внутри файла.

f = open('tabledefinition.sql')
full_sql = f.read()
sql_commands = full_sql.split(';')

for sql_command in sql_commands:
    curs.execute(sql_command)
...