【问题标题】:Query table with compound primary keys使用复合主键查询表
【发布时间】:2020-01-13 20:07:15
【问题描述】:

我正在使用pyodbc 连接到机器数据库,并使用

查询该数据库中的多个表

pandas.read_sql(tbl,cnxn), where tbl = "SELECT * FROM TABLE", cnxn is pyodbc.connect('DSN=DATASOURCE;UID=USERID;PWD=PASSWORD').

它适用于大多数表,但有些表会返回:

DatabaseError: sql 'SELECT * FROM TABLE' 执行失败: ('42S02', '[42S02] [Microsoft][ODBC driver for Oracle][Oracle]ORA-00942: 表或视图不存在 (942) (SQLExecDirectW)')

这些在 MS Access 中打开时返回错误的表在设计视图中打开时有多个列,左侧带有一个键图标(因此是一个 复合 主键,由多个列组成)。

这是我遇到上述错误的原因吗?我该如何解决这个问题?

编辑:如此屏幕截图所示,在设计视图中有多个列标记为构成主键:

Edit2:感谢您的反馈。查看ODBC数据源管理器窗口,该数据源为32位平台,驱动为Microsoft ODBC for Oracle。

我认为表的名称不是问题,因为其他表也可以工作并且它们具有相同的命名约定(表名采用这种格式NAME_OF_THE_TABLE)。因为在公司项目上工作,所以尽量避免显示表名。

我研究了主键的概念,发现一个表只能有一个,但如附图所示,左侧有五个字段显示一个键图标。

【问题讨论】:

  • 您的错误与主键无关。
  • 对不起,我正在编辑这个
  • 根据定义,您不能在表上有多个主键 - 始终只有最多一个主键 -但它可以由多个列组成(然后称为复合主键
  • 请显示引发该错误的表的名称。我有一个工作理论。此外,这些 Oracle 链接表是否在 MS Access 中?专门标记您的数据库。
  • 是的,我认为它使用的是 Oracle。我不确定这些 Oracle 是否链接到 MS Access 中的表,但我对此表示怀疑。仍然我的理论是,具有多个字段且附有关键图标的表存在一些不同。

标签: sql database pandas pyodbc


【解决方案1】:

首先,了解 MS Access 是一个unique,GUI 工具,它维护自己的默认数据库 JET/ACE 引擎,但也可以通过 OLEDB 连接到其他数据库,包括 Oracle、SQL Server、Postgres 等/ ODBC 连接。本质上,MS Access 和 Python 都在做同样的事情:与 Oracle(实际的后端数据库)建立 ODBC 连接。

因为所有linked tables 在 MS Access 中都可以正常连接,请尝试在 Python 中匹配连接和查询。问题可能涉及表名、模式连接或用户访问。

  1. 表格名称:您的表格包含拼写错误或reserved words,或CREATE TABLE 设置中定义的大小写混合导致区分大小写,因此Table 定义为@ 987654328@ 与TABLE 不同。因此,请使用 MS Access 链接表中的确切名称并用双引号括起来。

    pandas.read_sql('SELECT * FROM "Table"', cnxn)
    

    (请注意:SQL 中的双引号与 Python 中的双引号含义完全不同,并且不能与单引号互换。)

  2. 已连接架构/用户:架构不正确。因为 Oracle 中的模式或多或少是用户,所以您的 MS Access 链接表可能有多个连接。尽管它们都指向具有相同 ODBC 驱动程序的相同数据库服务器,但用户使用不同的基础表而有所不同。要解决此问题,请将 Python ODBC 连接与 MS Access ODBC 连接匹配:

    您可以在以下位置找到 MS Access 连接字符串:表格设计(来自导航窗格)> 属性表(来自功能区)> 描述。在pyodbc.connect(...) 调用中使用它。如果跨模式工作,可能只有 uidpwd 会有所不同。

  3. 非特权用户:连接的用户在该表上没有select privilege

【讨论】:

  • 我检查了属性表下的描述并更改了表名。不知怎的,它奏效了。太棒了,谢谢!这太令人困惑了,因为相同的方法适用于来自同一数据源的其他表!
  • 太棒了!你现在不应该确定它为什么以某种方式起作用吗?在 Python 中出错的表的名称是什么?他们是否区分大小写(即Table vs TABLE)?登陆此页面的未来读者可能需要知道。
  • 好的,我将在这里描述情况。当我将链接表加载到 MS Access 中时,当我选择表时,表名是ABC.NAME_OF_THE_TABLEABC 是我们的记录保存系统的名称。但是当表格加载到 MS Access 时,它的名称在All Access Objects 选项卡下更改为ABC_NAME_OF_THE_TABLE,点更改为下划线。对于某些表,我会忽略 ABC 并仅将表名指定为 NAME_OF_THE_TABLE 并且适用于这些表。但是对于我遇到问题的表,我必须指定ABC.NAME_OF_THE_TABLE。我不知道它是如何工作的!
  • ABC 可能是模式名称,您在所有模式之上的数据库级别进行连接。所以在 Python 查询中包含全名schema.table
猜你喜欢
  • 1970-01-01
  • 2018-08-01
  • 2014-06-22
  • 2016-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-13
  • 1970-01-01
相关资源
最近更新 更多