我在 sqlite 文件中有两个表,user 和 user_us。两个表具有相同的结构。我尝试使用一个类和一个继承的类来使用声明的属性修饰来访问两者。如果被访问的表不会被这个声明的属性改变,那么这样做有什么意义呢?我做错了什么?
class User(db.Model):
@declared_attr
def __tablename__(cls) -> str:
return str(cls.__name__.lower())
id = db.Column(db.Integer, primary_key=True)
class User_us(User):
pass
print(f'Test state: {User_us.__tablename__} {(User_us.__table__.name)}')
给出输出:
Test state: user_us user
我期待的是: 测试状态:user_us user_us 以及访问的表是user_us。
使用:
Flask-SQLAlchemy==3.1.1
SQLAlchemy==2.0.30
深入探索后,我发现这里不需要声明的_attr,因为在内部类名会变成小写,并使用我试图在这里声明它的方式
__tablename__
Reference
要继承一个类并重用它,我发现的优雅方法是将
__abstract__ = True
用于 general_model
,然后在其他两个类中继承它。
class general_model(db.Model):
__abstract__ = True
id = db.Column(db.Integer, primary_key=True)
class User(general_model):
pass
class User_US(general_model):
pass
print(f'Test state: {user_us.__tablename__} {(user_us.__table__.name)}')
这可以工作并打印。
Test state: user_us user_us
正如我所料。