[英]Flask-SQLAlchemy relationships without classes?
根据Flask-SQLAlchemy 文档,以下示例中的“地址”等关系期望类“地址”存在。
class Person(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50), nullable=False)
addresses = db.relationship('Address', backref='person', lazy=True)
class Address(db.Model):
...
但是,在我的情况下,表是在运行时创建的,因此我无法创建类。 是否可以在没有类的情况下使用关系函数? 如何动态创建表并将其告知关系函数? 如果这是不可能的,我是否需要为示例中的“地址”等表动态创建类?
我按照@Wimanicesir 的建议使用动态创建的类解决了它,但我不知道是否存在更优雅的解决方案:
from flask_appbuilder import Model, Base
from sqlalchemy import Column, Integer, String, ForeignKey, Table,
from sqlalchemy.orm import relationship
import config
from sqlalchemy import create_engine
engine = create_engine(config.SQLALCHEMY_DATABASE_URI)
associativeData = [
["language","lang"],
["license","license"],
["operatingsystem","os"],
["programminglanguage","plang"],
]
def repr(self):
return self.label
clazzes = []
for data in associativeData:
clazzes.append(type(data[0], (Base, ),
{
"__table__": Table(data[0], Base.metadata,autoload=True,autoload_with=engine),
"__repr__": repr
}))
associativeTables = list(map(lambda d: Table('swp_has_'+d[0], Base.metadata,
Column('swp_suffix', String(200), ForeignKey('softwareproduct.suffix')),
Column(d[1]+'_suffix', String(200), ForeignKey(d[0]+'.suffix'))
),
associativeData))
class Softwareproduct(Model):
suffix = Column(String(200), primary_key=True)
def __repr__(self):
return self.label
for i in range(len(associativeData)):
rel = relationship(associativeData[i][0], secondary = associativeTables[i])
setattr(Softwareproduct,"swp_has_"+associativeData[i][0],rel)
[...]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.