【问题标题】:How to execute .sql file on cx_oracle?如何在 cx_oracle 上执行 .sql 文件?
【发布时间】:2019-06-23 08:25:43
【问题描述】:

我想使用 cx_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)

但这不起作用。 有什么方法可以将文件作为参数传递,就像我为连接所做的那样:

dsn_tns = cx_Oracle.makedsn('server', 'port', service_name='service_name')
conn = cx_Oracle.connect(user='username', password='password', dsn=dsn_tns)

喜欢 sql_file = 'mysql.sql' ?

【问题讨论】:

  • 你说的“不起作用”是什么意思?请添加您收到的相关错误消息。此外,用分号拆分 sql 可能适用于多个 SQL 查询,但对于 PL/SQL 块肯定会失败。向我们展示您要运行的 sql 文件中的一些示例条目。
  • 理想情况下,我从命令提示符使用命令 -> user/password@host:port/db_service .@my_sql.sql 。所以我想知道是否有办法将 .@my_sql.sql 作为连接函数的参数?
  • 那么,the other answer 从您复制的代码中截取的问题中呢?
  • 我可以使用 os.system 或 subprocess.Popen() 做到这一点,但我的问题是通过使用 cx_Oracle 来实现我的目标
  • 在这种情况下,您显然已经看到并尝试了正确的答案。它仍然适用;无法将文件传递给 cx_oracle。即使有,它仍然会依赖文件具有正确的格式(就像您尝试的解决方案一样)。因此,如果您在将文件内容转换为 cx_oracle 可以解析的格式方面需要帮助,请添加@KaushikNayak 要求的信息。

标签: python oracle cx-oracle


【解决方案1】:

您可以使用该模块按原样运行 SQL:

from subprocess import Popen, PIPE

那么:

sqlrun = Popen(['sqlplus', 'User/Pass@DBINSTANCE'], shell=False , stdin=PIPE, stdout=PIPE, stderr=PIPE , encoding='utf8')

sqlrun.stdin.write('@' + 'tabledefinition.sql')

stdout, stderr = sqlrun.communicate()

返回状态:sqlrun.returncode
输出字符串:stdoutstderr

这用于 Unix shell 执行。 注意:也在 powershell 上测试成功

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-16
    • 2019-04-27
    • 2016-08-04
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 2015-08-12
    相关资源
    最近更新 更多