从删除外键的表中选择会导致 ProgrammingError: 1146, "Table <tablename> 不存在"

Posted

技术标签:

【中文标题】从删除外键的表中选择会导致 ProgrammingError: 1146, "Table <tablename> 不存在"【英文标题】:Selecting from table with deleted foreignkeys results in ProgrammingError: 1146, "Table <tablename> doesn't exist" 【发布时间】:2021-04-21 18:57:58 【问题描述】:

背景

我正在使用从旧版 SQL 转储文件生成的 mysql 数据库。一些表已从所述 SQL 转储文件中删除。

我要做什么

我正在使用 SQLAlchemy 和 pymysql 来选择行,并通过 the official tutorial:

from sqlalchemy import create_engine, select, MetaData, Table
import pymysql

metadata = MetaData()
db_connection_str = f'mysql+pymysql://db_user:db_password@localhost/db_name'
db_connection = create_engine(db_connection_str)
test_table = Table(<table_name>, metadata, autoload_with=db_connection)

有效,但不适用于所有表格。对于一个特定的表(存在于数据库中),它会抛出这个错误:

ProgrammingError: (pymysql.err.ProgrammingError) (1146, "Table '<missing_table_name>' doesn't exist")
[SQL: SHOW CREATE TABLE `<missing_table_name>`]
(Background on this error at: http://sqlalche.me/e/14/f405)

现有表还包含一个MUL 键列,其描述表明它指向&lt;missing_table_name&gt;。在导出 SQL 转储文件之前,&lt;missing_table_name&gt; 似乎已被删除。

是否有一种解决方法可以让我从现有表中选择行?

【问题讨论】:

在将数据导入mysql之前从sql转储中删除外键? 或者,您可以创建missing_table_name。但是很难用正确的(预期的)定义来创建它)。 【参考方案1】:

我偶然发现了this somewhat-related answer,这让我想知道Table 是否采用了类似的参数来禁用外键检查。根据文档,这不会引发上述错误:

test_table = Table('<table_name>', metadata, autoload_with=db_connection,resolve_fks=False)

但是,我不确定它是否允许我使用基于外键的查询。确认后将此问题标记为已回答。

【讨论】:

以上是关于从删除外键的表中选择会导致 ProgrammingError: 1146, "Table <tablename> 不存在"的主要内容,如果未能解决你的问题,请参考以下文章

当我从具有其他外键的表中删除一个条目时,相应的记录也不会被删除

从具有三个外键的表中选择一个表[关闭]

如何从具有两个外键的表中访问列?

where 从具有列外键的表中查询

如何在有外键关系的表中删除数据

MS Access:从没有外键的 2 个表中选择记录