0

SQLAlchemy を使用する Flask アプリがあり、ユニット テストで多対多の関係を機能させるのに問題があります。

私のsetUp方法では、アプリを作成し、データベースを次のように初期化します。

from flask.ext.sqlalchemy import SQLAlchemy
db = SQLAlchemy()

def setUp(self):
    self.app = create_app(env='test')
    self.app.logger.disabled = True
    db.init_app(self.app)
    with self.app.app_context():
        db.create_all()

そして、models.py で多対多を次のように定義します。

contact_buying_categories = db.Table('contact_buying_category',
    db.Column('contact_id', db.Integer, db.ForeignKey('contact.id')),
    db.Column('category_id', db.Integer, db.ForeignKey('buying_categories.id'))
)

class Contact(db.Model):

    __tablename__ = 'contact'
    __bind_key__ = 'db1'

    id = db.Column(db.Integer, primary_key=True)

    buying_categories = db.relationship('BuyingCategory',
                                        secondary=contact_buying_categories)


      ...

class BuyingCategory(db.Model):

    __tablename__ = 'buying_categories'
    __bind_key__ = 'db2'

    id = db.Column(db.Integer, primary_key=True)
    ...

単体テストを実行すると、次のエラーが発生します。

OperationalError: (OperationalError) no such table: contact_buying_category 
u'SELECT buying_categories.id AS buying_categories_id, buying_categories.name AS 
buying_categories_name \nFROM buying_categories, contact_buying_category \nWHERE ? = 
contact_buying_category.contact_id AND buying_categories.id = 
contact_buying_category.category_id' (1,)

create_all()呼び出し後に IPDB にドロップしてsetUpを実行するとdb.metadata.tables、次のテーブル定義が含まれます。

'contact_buying_category': Table('contact_buying_category', MetaData(bind=None), 
Column('contact_id', Integer(), ForeignKey('contact.id'), table=
<contact_buying_category>), Column('category_id', Integer(), 
ForeignKey('buying_categories.id'), table=<contact_buying_category>), schema=None),

contact_buying_category混乱しています。アプリがテーブルを見つけられないのはなぜですか? 実際に作成されているかどうかを確認するにはどうすればよいですか?

4

1 に答える 1

0

Flask-SQLAlchemy の多対多の関係に bind_key を設定して、への呼び出しで通知を受け取る必要がありましたdb.create_all()

contact_buying_categories = db.Table('contact_buying_category',
    db.Column('contact_id', db.Integer, db.ForeignKey('contact.id')),
    db.Column('category_id', db.Integer, db.ForeignKey('buying_categories.id')),
    info={'bind_key': 'wdl'}
)
于 2013-04-24T07:13:38.117 に答える