从 cursor.tables() 列表中删除表时出现“表 'MSysAccessStorage' 不存在”错误

Posted

技术标签:

【中文标题】从 cursor.tables() 列表中删除表时出现“表 \'MSysAccessStorage\' 不存在”错误【英文标题】:"Table 'MSysAccessStorage' does not exist" error when dropping tables from cursor.tables() list从 cursor.tables() 列表中删除表时出现“表 'MSysAccessStorage' 不存在”错误 【发布时间】:2021-09-23 14:07:30 【问题描述】:

我已连接到数据库并遍历元数据以获取表名,每次删除表。但是我收到错误消息:

pyodbc.ProgrammingError: ('42S02', "[42S02] [Microsoft][ODBC Microsoft Access Driver] Table 'MSysAccessStorage' does not exist. (-1305) (SQLExecDirectW)")

这没有意义,因为我从数据库中获取表名,所以它必须存在。我的连接必须正常工作以获取表名和我的代码的其他部分,例如插入工作。这是我的代码:

for row in cursor.tables():
            if(str(row.table_name)!="pricesBackup" and str(row.table_name)!="recipesBackup"):
                sqlLine="DROP TABLE costingDB1.accdb." + row.table_name
                print(sqlLine)
                cursor.execute(sqlLine)
                conn.commit()

这对我来说似乎很奇怪,想知道如何解决这个问题。提前谢谢你

【问题讨论】:

【参考方案1】:

名称以“MSys”开头的表是无法删除的内部系统表 (row.table_type == "SYSTEM TABLE")。您需要将删除限制在row.table_type == "TABLE" 所在的表中。

【讨论】:

所有表格都有同样的问题,包括价格等 只要使用f"DROP TABLE [row.table_name]"【参考方案2】:

我找到了解决方案:我从删除 MSys 表和 ~TMC 表的表名中创建了一个列表,所以就我的。然后,我使用此列表删除表。我认为问题在于循环中的 2 个 sql 查询发生冲突。它试图从 drop table 命令中查找表。

【讨论】:

以上是关于从 cursor.tables() 列表中删除表时出现“表 'MSysAccessStorage' 不存在”错误的主要内容,如果未能解决你的问题,请参考以下文章

Hadoop - 删除 Hive 表时超时

在搜索现有成员的链表时返回布尔结果 - java

编辑表时关闭 PyQt 事件循环

从给定数据库中选择所有表时,如何将 [dbo] 前缀附加到表名?

使用 pyODBC 连接到 ODBC

在事务中或删除表时使用“with nolock”