【问题标题】:Flask Sqlalchemy : relationships between different modulesFlask Sqlalchemy:不同模块之间的关系
【发布时间】:2012-07-28 02:03:08
【问题描述】:

我正在关注 Flask-SQLAlchemy 教程。 我在 python 2.6 上有 Flask 0.9、sqlalchemy 0.7.8 和 flask-sqlalchemy 0.16。

我正在尝试创建“一对多”关系,就像他们的教程中一样。

class Person(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))
    addresses = db.relationship('Address', backref='person',
                                lazy='dynamic')

class Address(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(50))
    person_id = db.Column(db.Integer, db.ForeignKey('person.id'))

之后,我就可以创建数据库了:

from DataBase.Tables.MyClass import db
db.create_all()

在同一个文件上创建两个类时效果很好。

当我想通过 2 个不同的文件(2 个不同的模块)创建它时,它不再起作用了。

这只是一个示例(我正在尝试用大量的类来做一些更复杂的事情,我需要在 2 个不同的模块之间存在关系,但我会简化它,所以我的问题更容易理解。)

我有 2 个模块:Person 和 Address,它们都有:

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///C:\\MyBase\\Base.sqlite'
db = SQLAlchemy(app)

并且它们每个都有之前编写的类的声明。

我的主要功能在第三个模块中:

from DataBase.Tables.Person import db as person_db
from DataBase.Tables.Address import db as address_db

if __name__ == "__main__":
    import DataBase.Tables.Person
    import DataBase.Tables.Address
    person_db.create_all()
    address_db.create_all()

我仍然在 Eclipse 中遇到错误:

*sqlalchemy.exc.NoReferencedTableError: 与列 'Address.person_id' 关联的外键找不到表 'person' 用于生成目标列 'sid' 的外键*

我可以找到另一个帖子,有人建议使用“元数据”,但我找不到合适的方法来使用它。

有没有人想办法解决这个问题?

谢谢!

【问题讨论】:

    标签: python sqlalchemy flask relationship flask-sqlalchemy


    【解决方案1】:

    您只需要以下一组,而不是每个模型的单独副本:

    app = Flask(my_app_name)
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///C:\\MyBase\\Base.sqlite'
    db = SQLAlchemy(app)
    

    这可以在一个单独的模块中定义(我们称之为shared),并导入到每个模型定义文件中。
    在这种情况下,主模块看起来更像:

    from DataBase.Tables.shared import db
    
    if __name__ == "__main__":
        import DataBase.Tables.Person   # will load Person model into the db
        import DataBase.Tables.Address  # will load Address model into the db
        db.create_all() # will create all models
    

    【讨论】:

      猜你喜欢
      • 2014-03-24
      • 2020-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 2015-08-05
      • 1970-01-01
      相关资源
      最近更新 更多