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

时间:2012-07-30 11:46:01

标签: python sqlalchemy flask relationship flask-sqlalchemy

我正在关注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个模块:人员和地址,他们都有:

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

并且每个人都有以前写过的类的声明。

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

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'*

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

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

谢谢!

1 个答案:

答案 0 :(得分:4)

您只需拥有以下一套,而不是每个型号的单独副本:

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