Flask Sqlalchemy:不同模块之间的关系

6

我正在学习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()

当两个类被创建在同一个文件中时,它可以很好地运行。

如果我想通过两个不同的文件(两个不同的模块)来创建它,它就不能工作了。

这只是一个例子(我正在尝试做一些更加复杂的事情,其中有大量的类,并且我需要存在于两个不同模块之间的关系,但我会简化它,以便我的问题更容易理解。)

我有两个模块: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'的外键 *

我找到了另一篇帖子,其中有人建议使用“metadata”,但我找不到正确的使用方法。

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

谢谢!

1个回答

7

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接