如何通过SQLAlchemy的Metadata区分表与视图?
区分SQLAlchemy Reflect后的表与视图
当使用metadata.reflect(views=True)加载数据库对象时,表和视图都会被封装为sqlalchemy.sql.schema.Table类型,无法直接通过对象类型区分。可以通过SQLAlchemy的Inspector工具查询数据库元数据,实现两者的区分:
实现步骤
- 导入
inspect工具类 - 创建
Inspector实例绑定到数据库引擎 - 遍历
metadata.tables时,通过Inspector获取的表/视图名单判断当前对象类型
完整代码示例
from sqlalchemy import MetaData, inspect # 原有的初始化逻辑 metadata = MetaData(bind=self.engine, schema=schema) metadata.reflect(views=True) # 创建Inspector实例获取数据库元数据 inspector = inspect(self.engine) current_schema_tables = inspector.get_table_names(schema=schema) current_schema_views = inspector.get_view_names(schema=schema) for key, table in metadata.tables.items(): print(table.name) # 判断当前对象是表还是视图 if table.name in current_schema_tables: print(f"{table.name} 是表") elif table.name in current_schema_views: print(f"{table.name} 是视图")
补充说明
Inspector直接读取数据库底层元数据,结果稳定可靠- 部分新版本SQLAlchemy(1.4+)中,可尝试通过
table.info.get('is_view')获取标记,但该方式依赖reflect内部逻辑,不如Inspector方法通用
内容的提问来源于stack exchange,提问作者Giu Belli
相关产品推荐
相关产品推荐

