【问题标题】:sqlalchemy fails to connect but cx_oracle succeedssqlalchemy 无法连接但 cx_oracle 成功
【发布时间】:2018-08-03 18:05:11
【问题描述】:

我正在尝试使用 Python 连接到 Oracle 服务器。我在 cx_Oracle 中有这个工作,但是当我尝试使用 sqlalchemy 连接时它失败了。 cx_Oracle 代码:

import cx_Oracle
import pandas as pd

cx_connection = cx_Oracle.connect(user+'/' + pw + '@' + host + ':' + port + '/' + db)
df = pd.read_sql(my_query, cx_connection)

按预期根据查询执行并返回数据库中的数据。如果我尝试使用 sqlalchemy 进行相同的连接:

import sqlalchemy

engine = sqlalchemy.create_engine('oracle+cx_oracle://' + user + ':' + pw + '@' + host + ':' + port + '/' + db)
sqlalchemy_connection = engine.connect()

最后一行出现错误:

DatabaseError: (cx_Oracle.DatabaseError) ORA-12505: TNS:listener does 当前不知道连接描述符中给出的 SID(背景 这个错误在:http://sqlalche.me/e/4xp6)

知道问题是什么吗? sqlalchemy 不只是使用 cx_Oracle 吗?是否有任何解决方法可以让 cx_Oracle 连接到 sqlalchemy?

【问题讨论】:

    标签: python sqlalchemy cx-oracle


    【解决方案1】:

    根据doc,使用 SQLAlchemy 的 Oracle 连接字符串的格式应为 oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...]。但是根据您之前的连接字符串,db 值实际上可能是 TNS 服务名称,所以在这种情况下,您要使用

    engine = sqlalchemy.create_engine('oracle+cx_oracle://' + user + ':' + pw + '@' + host + ':' + port + '/?service_name=' + db)
    

    【讨论】:

    • 糟糕,在尝试简化这篇文章时,我忽略了注意连接字符串不一样。我已编辑问题以显示您的引擎创建行存在问题。
    • @Kewl 好的,在这种情况下,查看前一个示例中的连接字符串模式,看起来它遵循site:username/password@host:port/SERVICE_NAME 中的这种模式。因此,可能的方法是在 sqlalchemy 中遵循这种模式:engine = sqlalchemy.create_engine('oracle+cx_oracle://' + user + ':' + pw + '@' + host + ':' + port + '/?service_name=' + db)。让我知道它是否有效,我将编辑我的答案。
    • 有效!太感谢了。更新答案,我会投票并接受它
    • 不适用于我 sqlalchemy.exc.OperationalError: (cx_Oracle.OperationalError) ORA-03135: connection lost contactcx_oracle.connect 有效
    猜你喜欢
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 2017-12-07
    • 2020-12-02
    • 1970-01-01
    • 2019-08-27
    • 2015-12-20
    • 2016-07-27
    相关资源
    最近更新 更多