如何为SQLAlchemy 2.0声明式模型添加正确类型提示
解决SQLAlchemy 2.0声明式模型的类型提示问题
你遇到的错误是因为传入函数的是类对象(比如User),而Base是实例类型,类型检查工具无法匹配。要满足你的两个要求,有两种可行的解决方法:
方法1:显式声明类级__table__属性并使用Type[Base]
在Base类中显式声明类级别的__table__属性,让类型检查工具识别该属性,同时用Type[Base]作为参数的类型提示:
from typing import Type from sqlalchemy.orm import DeclarativeBase from sqlalchemy.orm import Mapped from sqlalchemy.orm import mapped_column from sqlalchemy.sql.schema import Table class Base(DeclarativeBase): __table__: Table # 显式声明类级属性,辅助类型检查 class User(Base): __tablename__ = "user_account" id: Mapped[int] = mapped_column(primary_key=True) def drop_table(model: Type[Base]): model.__table__.drop() # 调用正常 drop_table(User)
方法2:直接使用DeclarativeMeta类型
SQLAlchemy 2.0中所有声明式模型类的元类都是DeclarativeMeta,可以直接用它作为类型提示:
from sqlalchemy.orm import DeclarativeBase from sqlalchemy.orm import Mapped from sqlalchemy.orm import mapped_column from sqlalchemy.orm import DeclarativeMeta class Base(DeclarativeBase): pass class User(Base): __tablename__ = "user_account" id: Mapped[int] = mapped_column(primary_key=True) def drop_table(model: DeclarativeMeta): model.__table__.drop() # 调用正常 drop_table(User)
错误原因解释
你最初用Base作为类型提示,是把参数当成了Base的实例,但实际传入的是Base的子类本身(类对象),所以类型检查工具抛出不兼容的错误。Type[Base]表示“所有Base子类的类类型”,而DeclarativeMeta是声明式模型类的元类,两者都能正确匹配传入的User类,同时让类型检查工具识别__table__属性及其方法。
内容的提问来源于stack exchange,提问作者LondonRob
相关产品推荐
相关产品推荐

