2013-04-22 55 views
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,) 

如果我放入IPDB在setUpcreate_all()呼叫並做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表?我如何檢查它是否真的被創建?

回答

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'} 
)