繁体   English   中英

没有类的 Flask-SQLAlchemy 关系?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM