Flask unittest и sqlalchemy, используя все соединения

Я только что столкнулся с проблемой запуска юнит-тестов в моем приложении фляги после того, как у меня было примерно 100 юнит-тестов. Все юнит-тесты пройдут, но при запуске все сразу провалится со следующей ошибкой:

OperationalError: (OperationalError) FATAL:  remaining connection slots are reserved for non-replication superuser connections

Все работает в экземпляре virtualbox / vagrant / ubuntu12.04 на локальной машине. Мой postgres max_connections установлен на 100, поэтому я предполагаю, что соединения не закрываются, и после выполнения 100 тестов я использую все доступные.

Этот человекМодульные тесты Flask с SQLAlchemy и PostgreSQL исчерпывают соединения БД похоже, у них точно такая же проблема. Майк / Zzzeek (sqlalchemy dev) даже ответил на это, сказав, что что-то может происходить в create_app (), поэтому я включил это также ниже.

Значит ли это, что я не закрываю свои связи где-нибудь? Все эти ошибки вызваныdb.create_all() в моем методе setUp () моего unittest.

# test.py

class TestCase(DataMixin, Base):
    """Base test class"""

    def create_app(self):
        return create_app(TestConfig())

    def setUp(self):
        db.create_all()

    def tearDown(self):
        db.session.remove()
        db.drop_all()

# app.py

def create_app(config=None):
    app = Flask(__name__)

    # Config
    app.config.from_object(BaseConfig())
    if config is not None:
        app.config.from_object(config)

    # Extensions
    db.init_app(app)
    mail.init_app(app)
    bcrypt.init_app(app)

    # Blueprints
    app.register_blueprint(core_blueprint, url_prefix='/')
    app.register_blueprint(accounts_blueprint, url_prefix='/account')
    app.register_blueprint(admin_blueprint, url_prefix='/admin')
    app.register_blueprint(cart_blueprint, url_prefix='/cart')

    # Login Manager
    login_manager.setup_app(app, add_context_processor=True)
    login_manager.login_view = "accounts.login"
    login_manager.user_callback = load_user

    # Templates
    app.jinja_env.globals['is_admin'] = is_admin
    app.jinja_env.globals['is_staff'] = is_staff

    @app.context_processor
    def inject_cart():
        cart = count = None
        if current_user.is_authenticated():
            cart = current_user.get_cart()
        return dict(cart=cart)

    # Error Handling
    @app.errorhandler(404)
    def page_not_found(error):
        return render_template('404.html'), 404

    return app

Ответы на вопрос(2)

Ваш ответ на вопрос