从 cx_oracle 执行一个 sql 脚本文件?

新手上路,请多包涵

有没有办法在 python 中使用 cx_oracle 执行 sql 脚本文件。

我需要在 sql 文件中执行我的创建表脚本。

原文由 user747858 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 924
2 个回答

cx_oracle 试图遵守的 PEP-249 实际上并没有这样的方法。

但是,这个过程应该非常简单。把文件的内容拉成一个字符串,用“;”分割字符,然后对结果数组的每个成员调用 .execute。我假设“;”字符仅用于分隔文件中的 oracle SQL 语句。

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

for sql_command in sql_commands:
    curs.execute(sql_command)

原文由 chipchilders 发布,翻译遵循 CC BY-SA 3.0 许可协议

另一种选择是使用 SQL*Plus(Oracle 的命令行工具)来运行脚本。您可以使用 subprocess 模块从 Python 调用它 - 这里有一个很好的演练: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 将命令发送到标准输入,等待 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

这将需要一些解析,具体取决于您想要返回程序其余部分的内容 - 如果它是交互式的,您可以向用户显示整个输出,或者如果您只想检查它是否存在,则扫描“ERROR”一词运行正常。

原文由 Neil Vass 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题