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