【问题标题】:Flask-appbuilder many-to-may relationship sqlalchemy.exc.NoReferencedTableError ErrorFlask-appbuilder 多对可能关系 sqlalchemy.exc.NoReferencedTableError 错误
【发布时间】:2014-12-07 09:36:46
【问题描述】:

我已经阅读了所有这些 (https://stackoverflow.com/search?q=sqlalchemy.exc.NoReferencedTableError%3A)、Flask-appbuilder 文档、sqlalchemy 文档和 Flask-sqlalchemy 文档等等。不幸的是,我找不到任何多对多 sqlalchemy 关系的完整示例。

我有一个使用 flask-appbuilder 的 python Flask 应用程序(它依赖于 flask-sqlalchemy)。我的 app/model.py 文件有这个:

field_feature_association = Table('field_feature_association',Base.metadata,
                                            Column('field_id', Integer, ForeignKey('field.id')),
                                            Column('feature_id',Integer, ForeignKey('feature.id')),
                                            schema="main"
                                        )

class field(Model):
    __tablename__ = 'field'
    id = Column(Integer, primary_key=True)
    name = Column(String(70), nullable=False)
    database_type = Column(String(70)) #varchar(255), text, int
    joinable_to = Column(Text()) 
    notes = Column(Text()) #don't use this for X 
    table_id = Column(Integer, ForeignKey('table.id'))
    table = relationship("table")
    features = relationship("feature",
                    secondary = field_feature_association,
                    backref = backref('fields'), 
                    )

    def __repr__(self):
        return self.name

class feature(Model):
    __tablename__ = 'feature'
    id = Column(Integer, primary_key=True)
    name = Column(String(70), unique = True, nullable=False)
    field_id = Column(Integer, ForeignKey('field.id'))
    #field = relationship("field")

    def __repr__(self):
        return self.name

它正在生成此错误:

sqlalchemy.exc.NoReferencedTableError: Foreign key associated with column 'field_feature_association.feature_id' could not find table 'feature' with which to generate a foreign key to target column 'id'

关于如何修复此错误的想法?

【问题讨论】:

    标签: python-2.7 flask flask-sqlalchemy


    【解决方案1】:

    这里是 SQLAlchemy 中的a working sample of many-to-many。此外,我修改了您的模型并且效果很好:

    field_feature_association = db.Table('field_feature_association', db.Model.metadata,
                                         db.Column('field_id', db.Integer, db.ForeignKey('field.id')),
                                         db.Column('feature_id', db.Integer, db.ForeignKey('feature.id')),
                                              schema="main"
            )
    
    
    class Field(db.Model):
        __tablename__ = 'field'
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(70), nullable=False)
        database_type = db.Column(db.String(70))  # varchar(255), text, int
        joinable_to = db.Column(db.Text())
        notes = db.Column(db.Text())  # don't use this for X
        features = db.relationship("Feature",
                                secondary=field_feature_association,
                                backref=db.backref('fields'),
        )
    
        def __repr__(self):
            return self.name
    
    
    class Feature(db.Model):
        __tablename__ = 'feature'
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(70), unique=True, nullable=False)
        field_id = db.Column(db.Integer, db.ForeignKey('field.id'))
        # field = relationship("field")
    
        def __repr__(self):
            return self.name
    

    这是如何使用它:

    field = Field()
    field.name="filed1"
    feature = Feature()
    feature.name = "feature1"
    field.features.append(feature)
    db.session.add(field)
    db.session.commit()
    

    我的数据库对象被导入为“db”,我明确地使用它来引用其他类型。

    【讨论】:

    • 谢谢。在关联表中将其从 Base.metadata 更改为 Model.metadata 有效。
    猜你喜欢
    • 2020-12-26
    • 1970-01-01
    • 2021-01-07
    • 2020-04-14
    • 2018-07-13
    • 2023-03-16
    • 2017-08-30
    • 2015-06-30
    • 2018-12-19
    相关资源
    最近更新 更多