Flask-SQLAlchemy中多个相同表格

0 投票
1 回答
1088 浏览
提问于 2025-04-17 23:20

我正在创建一个类似REST的API,用来从一个老旧的数据库中获取和存储数据。目前我不能改变数据库的结构。这个数据库里的几乎每个表都有完全相同的结构。现在我用Flask-SQLAlchemy来处理这个问题,代码如下:

class MyDatasetBase(object):
    timestamp = db.Column('colname', db.Float, primary_key=True)
    val1 = db.Column(db.Float)
    val2 = db.Column(db.Float)
    val3 = db.Column(db.Float)
    fkeyid = db.Column(db.Integer)

    @declared_attr
    def foreigntable(self):
        return db.relationship('ForeignTableClass', uselist=False)

class Table1(MyDatasetBase, db.Model):
    __tablename__ = 'table1'

class Table2(MyDatasetBase, db.Model):
    __tablename__ = 'table2'

class ForeignTableClass(db.Model):
    __tablename__ = 'ForeignTable'
    id = db.Column(db.Integer, db.ForeignKey('table1.fkeyid'), db.ForeignKey('table2.fkeyid'), primary_key=True)
    name = db.Column(db.String)

这些都能正常工作,但有些数据集包含很多表,我觉得应该有更高效的方法来处理其中的一些事情。

有没有办法不用为每个从MyDatasetBase派生的表单独定义一个类?如果可以的话,这样做会不会在外键方面造成问题?因为在ForeignTableClass中,我需要为上面列出的每个表定义id作为外键。

1 个回答

0

一种方法是使用 type 方法:

names = ['table1', 'table2', 'table3']

for name in names:
    type(name.title(), (MyDatasetBase, db.Model), { '__tablename__' : name })
# generate <class 'flask_sqlalchemy.Table1'> ... 

也许还有一种更符合Python风格或更优雅的方法,可以使用 MetadataTable.tometadata() 方法。

撰写回答