7

この多対多の結合をFlask-SQLAlchemyと2つのMySQLデータベースで機能させようとしていますが、結合テーブルに間違ったデータベースを使用していることを除けば、非常に近いものです。これが基本です...

私が持っているmain_dbvendor_db。テーブルは、、(リレーションテーブル)、そして。として設定さmain_db.usersmain_db.user_productsますvendor_db.products。それらがすべてどのように接続されているかをかなり明確にする必要があります。

私のapp.pyでは、次のようにデータベースを設定しています。

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://user:pass@localhost/main_db'
app.config['SQLALCHEMY_BINDS'] = {
        'vendor_db': 'mysql://user:pass@localhost/vendor_db'
}

モデル定義は次のように設定されます。

from app import db

# Setup relationship
user_products_tbl = db.Table('user_products', db.metadata,
        db.Column('user_id', db.Integer, db.ForeignKey('users.user_id')),
        db.Column('product_id', db.Integer, db.ForeignKey('products.product_id'))
)

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column('user_id', db.Integer, primary_key=True)
    products = db.relationship("Product", secondary=user_products_tbl,
            backref="users", lazy="dynamic")

class Product(db.Model):
    __bind_key__ = 'vendor_db'
    __tablename__ = 'products'
    id = db.Column('product_id', db.Integer, primary_key=True)
    name = db.Column(db.String(120))

問題は、ユーザーの製品を取得しようとするvendor_dbと、の代わりに結合テーブルに使用しようとしていることですmain_dbmain_db代わりにどのように使用できるかについてのアイデアはありますか?別のバインドをmain_db設定info={'bind_key': 'main_db'}してリレーションシップテーブル定義を設定しようとしましたが、うまくいきませんでした。ありがとう!

4

1 に答える 1

12

ここで必要なことは、user_products_tblテーブル定義でスキーマを指定することでした。それで、

user_products_tbl = db.Table('user_products', db.metadata,
        db.Column('user_id', db.Integer, db.ForeignKey('users.user_id')),
        db.Column('product_id', db.Integer, db.ForeignKey('products.product_id')),
        schema='main_db'
)

これが他の誰かに役立つことを願っています!

于 2012-07-11T18:52:58.807 に答える