【问题标题】:Multiple Identical Tables in Flask-SQLAlchemyFlask-SQLAlchemy 中的多个相同表
【发布时间】:2014-03-21 18:45:41
【问题描述】:

我正在创建一个类似 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 定义为上面列出的每个表的外键?

【问题讨论】:

    标签: python sqlalchemy flask flask-sqlalchemy


    【解决方案1】:

    一种方法是使用type 方法:

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

    使用MetedataTable.tometadata() 方法可能有更pythonic/优雅的方法。

    【讨论】:

    • 这很有效,可以显着减少一堆文件中的大小和重复代码。谢谢。
    猜你喜欢
    • 2020-10-04
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    • 2016-06-16
    • 1970-01-01
    • 2017-11-10
    • 2022-01-09
    相关资源
    最近更新 更多