只能通过oracle-instant Client访问Flask-SQLAlchemy中的cx_Oracle吗?

时间:2019-02-06 07:06:11

标签: python docker sqlalchemy cx-oracle

我的oracle数据库[OracleSlim]在Docker容器中启动并运行,我在容器内创建了一个用户表。它在 0.0.0.0:1521 上运行。我需要“安装了Oracle Instant Client”才能使cx_oracle工作吗?

我在容器内尝试了这个'sqlplus administrator / Welcome121 @ ORCLCDB'连接字符串。它正在工作。

from sqlalchemy import create_engine
import cx_Oracle
engine=create_engine('oracle://username:password@hostname:port/sid')

错误:

  

cx_Oracle.DatabaseError:DPI-1047:64位Oracle客户端库无法   被加载:“ libclntsh.so:无法打开共享的对象文件:没有这样的文件   或目录”。请参阅   https://oracle.github.io/odpi/doc/installation.html#linux寻求帮助

我的flask-Sqlalchemy的Engine对象中的oracle成功连接。 欢迎使用新的ORM或用于连接oracle的软件包。 注意: 我还没有在本地安装oracle Instant Client 但已将其安装在我的容器中。

  

已更新

现在我在Docker容器上运行了Oracle,我将在本地将来自Python cx_Oracle的那些连接起来。使用下面的方法,

import cx_Oracle
constr = 'system/oracle@//172.17.0.2:1521/orcl.localdomain'
conn = cx_Oracle.connect(constr)

是否可以借助python cx_Oracle或Flask-SQLAlchemy与运行在localhost:1521上的容器连接?

2 个答案:

答案 0 :(得分:0)

您确实需要oracle客户端库:

这来自cx_Oracle文档:

要将cx_Oracle 7与Python和Oracle数据库一起使用,您需要: Python 2.7或3.5及更高版本。较旧的cx_Oracle版本可能与较旧的Python版本一起使用。 Oracle客户端库。这些可以来自免费的Oracle Instant Client,或者如果Python与数据库在同一台计算机上,则可以从Oracle数据库中获得。 Linux,Windows和macOS支持Oracle客户端库版本18、12和11.2。用户还报告了其他平台的成功。 Oracle数据库。 Oracle的标准客户端-服务器版本互操作性允许cx_Oracle连接到旧数据库和新数据库。

答案 1 :(得分:0)

如果sqlplus administrator/Welcome121@ORCLCDB'在工作,则您必须已经有Oracle Client库可用,因为sqlplus和cx_Oracle都需要相同的Oracle库集。验证sqlplus可以真正查询您的数据库。

检查SQL * Plus版本是否为11.2或更高版本。然后找出sqlplus和python的配置之间的区别。配置与sqlplus相同的cx_Oracle所需的环境变量。如果已安装完整的Oracle Client或Oracle DB,则可以在使用source /usr/local/bin/oraenv运行python之前设置环境。如果您使用旧的Oracle XE 11.2,则命令为source /u01/app/oracle/product/11.2.0/xe/bin/oracle_env.sh

如果您没有Oracle Client库,请在https://cx-oracle.readthedocs.io/en/latest/installation.html#installing-cx-oracle-on-linux之后安装它们,我建议使用ldconfig来设置库搜索路径。