2012-07-30 75 views
3

我遵循Flask-SQLAlchemy教程。 我在python 2.6上有Flask 0.9,sqlalchemy 0.7.8和flask-sqlalchemy 0.16。Flask Sqlalchemy:不同模塊之間的關係

我想創建一對多的關係,就像在他們的教程中一樣。

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個模塊:Person和地址,它們都有:

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' 可能找不到表'人',以產生一個外鍵,以目標列'sid'*

我可以找到另一篇文章,有人建議使用「元數據」,但我找不到正確的方法來使用。

有沒有人有想法解決這個問題?

謝謝!

回答

3

你需要有隻有一組的下方,而不是每個模型的單獨副本:

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 
+0

聽起來不錯,我想現在這樣 – Yace 2012-07-30 13:52:03

+0

完美工作,感謝:) – Yace 2012-08-03 12:49:11