Flask-SQLAlchemy中的多个相同表

时间:2014-03-21 18:45:41

标签: python sqlalchemy flask flask-sqlalchemy

我正在创建一个类似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 :(得分:0)

一种方法是使用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 /优雅方法。