遍历cursor.tables()列表删表时提示'MSysAccessStorage'不存在如何解决
问题原因
cursor.tables()默认返回Access数据库内所有类型的表对象,包括以MSys为前缀的内置系统表,这类表属于Access的系统元数据,本身不允许用户执行删除操作,部分虚拟系统表物理上不存在,因此会触发不存在的报错。- DROP TABLE语句语法错误:你已经通过pyodbc连接到
costingDB1.accdb,执行删除操作不需要额外加库名前缀,添加前缀反而会导致Access驱动无法正确识别表名。 - 没有过滤表类型:
cursor.tables()返回结果包含视图、链接表、系统表等多种对象,只有table_type为TABLE的才是用户创建的普通表,可执行删除操作。
修复方案
修改后的代码如下:
for row in cursor.tables(): # 过滤普通用户表,排除系统表、视图等非可删对象 if row.table_type == "TABLE" \ and not str(row.table_name).startswith("MSys") \ and str(row.table_name) not in ("pricesBackup", "recipesBackup"): # 用反引号包裹表名,避免表名含空格、特殊字符时触发语法错误 sqlLine = f"DROP TABLE `{row.table_name}`" print(sqlLine) cursor.execute(sqlLine) conn.commit()
内容的提问来源于stack exchange,提问作者astropos
相关产品推荐
相关产品推荐

