使用复合主键查询 table

Query table with compound primary keys

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

查询该数据库中的多个 table

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

它适用于大多数 tables,但某些 tables return:

DatabaseError: Execution failed on sql 'SELECT * FROM TABLE': ('42S02', '[42S02] [Microsoft][ODBC driver for Oracle][Oracle]ORA-00942: table or view does not exist (942) (SQLExecDirectW)')

这些 table 是 return 一个错误,当在 MS Access 中打开时,在设计视图中打开时有多个列,左侧有一个钥匙图标(因此 复合主键,由多列组成)。

这就是我出现上述错误的原因吗?我该如何解决?

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

Edit2:感谢您的反馈。查看ODBC Data Source Administratorwindow,该数据源为32位平台,驱动为Microsoft ODBC for Oracle

我不认为 table 的名字是问题所在,因为其他 table 可以工作并且它们有相同的命名约定(table 名字的格式是 NAME_OF_THE_TABLE).因为在公司项目上工作,所以试图避免显示 table 姓名。

我确实研究了主键的概念,发现一个 table 只能有一个,但是如所附的屏幕截图所示,有五个字段在左侧显示了一个键图标。

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

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

  1. Table 姓名:您的 table 包含拼写错误或 reserved words,或大小写混合在他们的 CREATE TABLE 设置中定义,导致区分大小写,因此 CREATE TABLE "Table" 定义的 TableTABLE 不同。为此,请在链接 table 的 MS Access 中使用准确的名称并用双引号引起来。

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

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

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

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

  3. 非特权用户:连接的用户在 table.[=23 上没有 select privilege =]