When using Flask SQLAlchemy to federate calls to create_engine whilst also passing in an instance of Pool via the bind configuration option pool=my_pool, Flask SQLAlchemy will always set echo_pool to either False or True in the kwargs to create_engine internally.
When SQLAlchemy creates an engine from a pre-instantiated Pool object, it does not consume the echo_pool kwarg and as a result fails to create the engine as it fails to assert that all kwargs were consumed.
To reproduce:
import sqlite3
import sqlalchemy as sa
pool = sa.pool.StaticPool(creator=lambda: sqlite3.connect(":memory:"))
app.config["SQLALCHEMY_BINDS"] = {"a": {"url": "sqlite://", "pool": pool}}
db = SQLAlchemy(app, model_class=model_class)
assert db.engines["a"].pool is pool
.venv/lib/python3.13/site-packages/flask_sqlalchemy/extension.py:278: in __init__
self.init_app(app)
.venv/lib/python3.13/site-packages/flask_sqlalchemy/extension.py:374: in init_app
engines[key] = self._make_engine(key, options, app)
.venv/lib/python3.13/site-packages/flask_sqlalchemy/extension.py:665: in _make_engine
return sa.engine_from_config(options, prefix="")
.venv/lib/python3.13/site-packages/sqlalchemy/engine/create.py:820: in engine_from_config
return create_engine(url, **options)
.venv/lib/python3.13/site-packages/sqlalchemy/util/deprecations.py:281: in warned
return fn(*args, **kwargs) # type: ignore[no-any-return]
.venv/lib/python3.13/site-packages/sqlalchemy/engine/create.py:697: in create_engine
raise TypeError(
E TypeError: Invalid argument(s) 'echo_pool' sent to create_engine(), using configuration PGDialect_psycopg2/StaticPool/Engine. Please check that the keyword arguments are appropriate for this combination of components.
I would expect this to not error via not setting echo_pool in the kwargs when pool is passed via the bind config.
Environment:
- Python version: 3.13.11
- Flask-SQLAlchemy version: 3.1.1
- SQLAlchemy version: 2.0.49
When using Flask SQLAlchemy to federate calls to
create_enginewhilst also passing in an instance ofPoolvia the bind configuration optionpool=my_pool, Flask SQLAlchemy will always setecho_poolto eitherFalseorTruein thekwargstocreate_engineinternally.When SQLAlchemy creates an engine from a pre-instantiated
Poolobject, it does not consume theecho_poolkwarg and as a result fails to create the engine as it fails to assert that all kwargs were consumed.To reproduce:
I would expect this to not error via not setting
echo_poolin the kwargs whenpoolis passed via the bind config.Environment: