如何在SQLAlchemy中继承声明性而不设置__tablename__?

2 投票
1 回答
2001 浏览
提问于 2025-04-17 18:23

我在使用flask-sqlalchemy的时候,想创建一些类来继承声明类,并添加__bind_key__。这样我就可以创建一些表,并继承这些绑定的类。

from flask.ext.sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class Model1(db.Model):
    __bind_key__ = 'db2'

class Table1(Model1):
    __tablename__ = 'table1'
    name = db.Column(db.String(100))

但是我遇到了一些问题:

sqlalchemy.exc.InvalidRequestError: Class <class '__main__.Model1'> 
    does not have a     __table__ or __tablename__ specified 
    and does not inherit from an existing table-mapped class.

我该怎么解决呢?

1 个回答

5

你还可以使用 __abstract__ 这个标志:

from flask.ext.sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class Model1(db.Model):
    __abstract__ = True
    __bind_key__ = 'db2'

class Table1(Model1):
    __tablename__ = 'table1'
    name = db.Column(db.String(100))

如果一个类的 __abstract__ 设置为 True,那么 SQLAlchemy 的声明式方法会忽略这个类(详细信息可以查看这里的文档)。另外,这样做的好处是,你可以在你的 Model1 中添加一些 SQLAlchemy 特有的属性(比如列)。

撰写回答