SQLAlchemy 引擎无法从特定 Oracle EBS 表获取记录,但 Talend Open Studio 成功

问题描述 投票:0回答:1

我面临涉及 Oracle EBS 数据库的特定场景的问题。我正在尝试使用 Python 中的 SQLAlchemy 从名为

ap_lookup_codes
的表中获取记录。然而,尽管成功地从同一数据库中的其他表中获取了记录,但 SQLAlchemy 引擎无法从此表中检索任何记录,并且不会产生任何错误。

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

# Replace the connection string with your actual database connection details
engine = create_engine('oracle+cx_oracle://user:password@host:port/dbname')
Session = sessionmaker(bind=engine)
session = Session()
    
results = session.execute("SELECT * FROM ap_lookup_codes").fetchall()
print(results)

有趣的是,当我在 Talend Open Studio 中执行类似的数据获取操作时,它成功从

ap_lookup_codes
表中检索记录。这种差异表明该问题可能特定于 SQLAlchemy 与此表的交互方式。

SQLAlchemy 无法从

ap_lookup_codes
表中获取记录的可能原因是什么,特别是考虑到 Talend Open Studio 可以成功获取记录?在处理 Oracle EBS 数据库时,SQLAlchemy 中是否存在可能导致此行为的任何已知限制或配置?

oracle sqlalchemy cx-oracle
1个回答
0
投票

COMMIT
ted 的数据仅在创建它的会话中可见(如果尚未
ROLLBACK
ted,则在会话结束时将
COMMIT
)。如果您看不到另一个会话中的数据(即在 SQLAlchemy 中),请确保您已在
COMMIT
编辑数据的 SQL 客户端(即 Talend Open Studio)中发出
INSERT
命令。

注意:即使您以同一用户身份连接,这也会创建一个单独的会话,您将无法看到另一个会话中未提交的数据。

来自

COMMIT
文档

直到您提交交易:

  • 通过查询修改的表,您可以看到您在事务过程中所做的任何更改,但其他用户无法看到这些更改。提交事务后,更改对于提交后执行的其他用户的语句是可见的。
  • 您可以使用
    ROLLBACK
    语句回滚(撤消)事务期间所做的任何更改(请参阅
    ROLLBACK
    )。

如果数据已提交,则:

  1. 确保您连接到正确的数据库实例。

  2. 确保您连接到正确的用户。

  3. 确保您连接的用户(如果不是所有者)有权查看数据。

  4. 确保您正在查询正确的表。

    注意:Oracle 区分大小写,但在许多情况下,会通过将不带引号的标识符转换为大写来将其从用户中抽象出来,因此:

    SELECT * FROM ap_lookup_codes
    

    与以下任意一项相同:

    SELECT * FROM AP_LOOKUP_CODES
    SELECT * FROM Ap_Lookup_Codes
    SELECT * FROM Ap_LoOkUp_CoDeS
    SELECT * FROM "AP_LOOKUP_CODES"
    

    但是:

    SELECT * FROM "ap_lookup_codes"
    

    将查询不同的表。如果您的表名实际上是小写,那么您将需要使用带引号的标识符。您可能会发现有两个表,一个是小写的,包含数据,另一个是同名但大写的,不包含数据(这就是为什么使用带引号的标识符不被认为是好的做法的原因之一,因为您可以进入您有多个表的情况仅因名称中使用的大小写不同而导致混乱)。

© www.soinside.com 2019 - 2024. All rights reserved.