如何动态定义带继承与静态属性的SQLModel类(解决元类冲突)
解决动态创建SQLModel子类的元类冲突问题
你之前的错误在于把registry=self.mapper_registry当成了基类传入type的第二个参数,但它本质是SQLModel类定义时的元类关键字参数(用于指定SQLAlchemy的mapper注册表),并非要继承的父类。将非类对象放入基类元组,直接触发了元类不兼容的冲突。
正确的动态创建方式
方式一:使用type函数并传递元类参数
直接通过type创建类时,仅将SQLModel作为父类,把registry作为关键字参数传递给元类:
from sqlalchemy import MetaData from sqlmodel import SQLModel SQLModel_custom = type( 'SQLModel_custom', (SQLModel,), # 仅SQLModel作为父类 {'metadata': MetaData(schema=self.schema)}, registry=self.mapper_registry # 传递registry给元类 )
方式二:显式调用SQLModel的元类
SQLModel的元类是SQLModelMeta,可以直接用它来创建类,参数传递更直观:
from sqlalchemy import MetaData from sqlmodel import SQLModel, SQLModelMeta SQLModel_custom = SQLModelMeta( 'SQLModel_custom', (SQLModel,), {'metadata': MetaData(schema=self.schema)}, registry=self.mapper_registry )
验证效果
以上两种方式创建的SQLModel_custom类,和你原本静态定义的类功能完全一致,既指定了自定义的metadata,也正确绑定了目标mapper_registry,同时避免了元类冲突。
内容的提问来源于stack exchange,提问作者ibi0tux
相关产品推荐
相关产品推荐

