SQLAlchemy 1.4 封装MetaData.reflect到函数返回None无法使用问题
错误原因
SQLAlchemy 的 MetaData.reflect() 是原地操作方法,执行后只会修改当前 MetaData 实例的元数据内容,返回值固定为 None。你之前的封装逻辑直接返回了 meta.reflect() 的执行结果,所以 self.meta 拿到的就是 None,调用属性就会报错。
修正实现
你可以根据自身业务场景选以下两种封装方式:
方案1:实例化时仅初始化一次元数据(性能更高,适合表结构固定的场景)
class Db: def __init__(self, config): self.engine = create_async_engine(ENGINE, echo=True, future=True) self.session = sessionmaker(self.engine, expire_on_commit=False, class_=AsyncSession) # 提前初始化好元数据存在私有属性 self._meta = self._init_metadata() def _init_metadata(self): meta = MetaData() # 先执行reflect加载元数据 meta.reflect(bind=sync_engine) # 直接返回MetaData实例而非reflect的返回值 return meta # 对外提供self.meta()调用入口 def meta(self): return self._meta def get_table_names(self): return self.meta().tables.keys()
方案2:每次调用都拉取最新元数据(适合运行时会动态修改表结构的场景)
class Db: def __init__(self, config): self.engine = create_async_engine(ENGINE, echo=True, future=True) self.session = sessionmaker(self.engine, expire_on_commit=False, class_=AsyncSession) # 每次调用都重新生成MetaData实例拉取最新表结构 def meta(self): meta = MetaData() meta.reflect(bind=sync_engine) return meta def get_table_names(self): return self.meta().tables.keys()
内容的提问来源于stack exchange,提问作者alphaomega
相关产品推荐
相关产品推荐

