6

Flask-SQLAlchemy チュートリアルに従っています。Python 2.6でFlask 0.9、sqlalchemy 0.7.8、flask-sqlalchemy 0.16を使用しています。

チュートリアルのように、「1対多」の関係を作成しようとしています。

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)

それぞれに、前に書かれたクラスの宣言があります。

私の主な機能は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' に関連付けられた外部キーは、ターゲット列 'sid' への外部キーを生成するテーブル 'person' を見つけることができませんでした*

「メタデータ」の使用を提案している別の投稿を見つけることができましたが、それを使用する適切な方法が見つかりませんでした。

これを解決するアイデアはありますか?

ありがとう !

4

1 に答える 1

7

モデルごとに個別のコピーではなく、以下のセットを 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
于 2012-07-30T12:46:15.587 に答える