2013-02-25 1 views
4

У меня есть приложение Flask, которое использует Flask-SQLAlchemy. В моих модульных тестах я инициализирую приложение и БД, затем вызываю db.create_all(), и по какой-то причине похоже, что он не подбирает ни одну из моих моделей, поэтому не создает никаких таблиц.Flask-SQLAlchemy не создает таблицы using create_all()

В моих моделях используются как __tablename__, так и __bind_key__, поскольку у меня есть две базы данных.

Мой конфиг:

SQLALCHEMY_DATABASE_URI = 'sqlite://' 

SQLALCHEMY_BINDS = { 
    'db1': SQLALCHEMY_DATABASE_URI, 
    'db2': SQLALCHEMY_DATABASE_URI 
} 

Сокращенный вариант моего setUp() метода в моих модульных тестов:

from flask import Flask 
from flask.ext.sqlalchemy import SQLAlchemy 

class APITestCase(unittest.TestCase): 

    app = Flask(__name__) 
    db = SQLAlchemy(app) 
    db.create_all() 

Вот пример двух моих моделей, по одному от каждого типа связывания:

class Contact(db.Model): 

    __tablename__ = 'contact' 
    __bind_key__ = 'db1' 

    id = db.Column(db.Integer, primary_key=True) 
    first_name = db.Column(db.String(255)) 
    last_name = db.Column(db.String(255)) 
    ... 

    def __init__(first_name, last_name): 
     self.first_name = first_name 
     self.last_name = last_name 
     ... 

class BaseUser(db.Model): 

    __tablename__ = 'User__GeneralUser' 
    __bind_key__ = 'db2' 

    id = db.Column(db.Integer, primary_key=True) 
    username = db.Column('Username', db.String(100)) 
    first_name = db.Column('FirstName', db.String(100)) 
    last_name = db.Column('Surname', db.String(100)) 
    ... 

    def __init__(username, first_name, last_name): 
     self.username = username 
     self.first_name = first_name 
     self.last_name = last_name 
     ... 

Я пропустил что-то очевидное? Как Flask-SQLAlchemy знает, где искать мои модели для создания связанных таблиц?

+0

Вы ввезенных классы моделей? – flyx

+0

Да, я пробовал как с, так и без импорта моих моделей. –

ответ

10

В модульных тестов вы не должны создать новый экземпляр объекта SQLAlchemy («дб»), вы должны импортировать экземпляр, из которого ваши модели снизойти:

models.py:

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

class Contact(db.Model): 
    ... 

tests.py:

from models import db 
from flask import Flask 
import unittest 

class TestExample(unittest.TestCase): 

    def setUp(self): 
     self.app = Flask(__name__) 
     db.init_app(self.app) 
     with self.app.app_context(): 
      db.create_all() 
+0

Каковы некоторые хорошие способы убедиться, что все объявления моделей выполнены, если они реализованы во многих модулях? – satoru