Flasche unittest und sqlalchemy unter Verwendung aller Anschlüsse

Ich bin gerade auf ein Problem gestoßen, bei dem Unittests in meiner Flaschen-App ausgeführt wurden, nachdem ich ungefähr 100 Unittests hatte. Alle Unittests bestehen, aber wenn sie auf einmal ausgeführt werden, schlagen sie mit dem folgenden Fehler fehl:

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

Alles läuft in einer virtualbox / vagrant / ubuntu12.04-Instanz auf dem lokalen Rechner. Mein postgres max_connections ist auf 100 gesetzt, also gehe ich davon aus, dass die Verbindungen nicht geschlossen werden und nach 100 Tests verbrauche ich alle verfügbaren.

Diese PersonFlask Unit Tests mit SQLAlchemy und PostgreSQL erschöpfen die Datenbankverbindungen Sieht so aus, als hätten sie genau dasselbe Problem. Mike / Zzzeek (sqlalchemy dev) antworteten sogar, dass in create_app () möglicherweise etwas passiert, also habe ich das auch weiter unten eingefügt.

Bedeutet das, dass ich meine Verbindungen nicht irgendwo schließe? Alle diese Fehler werden durch ausgelöstdb.create_all() in meiner setUp () Methode meiner 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

Antworten auf die Frage(2)

Ihre Antwort auf die Frage