Changes
*******


Version 2.4.0
=============

Released 2019-04-23

* Make engine configuration more flexible. (#684)

* Address SQLAlchemy 1.3 deprecations. (#684)

* "get_or_404()" and "first_or_404()" now accept a "description"
  parameter to control the 404 message. (#636)

* Use "time.perf_counter" for Python 3 on Windows. (#638)

* Drop support for Python 2.6 and 3.3. (#687)

* Add an example of Flask's tutorial project, Flaskr, adapted for
  Flask-SQLAlchemy. (#720)


Version 2.3.2
=============

Released 2017-10-11

* Don't mask the parent table for single-table inheritance models.
  (#561)


Version 2.3.1
=============

Released 2017-10-05

* If a model has a table name that matches an existing table in the
  metadata, use that table. Fixes a regression where reflected tables
  were not picked up by models. (#551)

* Raise the correct error when a model has a table name but no
  primary key. (#556)

* Fix "repr" on models that don't have an identity because they have
  not been flushed yet. (#555)

* Allow specifying a "max_per_page" limit for pagination, to avoid
  users specifying high values in the request args. (#542)

* For "paginate" with "error_out=False", the minimum value for
  "page" is 1 and "per_page" is 0. (#558)


Version 2.3.0
=============

Released 2017-09-28

* Multiple bugs with "__tablename__" generation are fixed. Names
  will be generated for models that define a primary key, but not for
  single-table inheritance subclasses. Names will not override a
  "declared_attr". "PrimaryKeyConstraint" is detected. (#541)

* Passing an existing "declarative_base()" as "model_class" to
  "SQLAlchemy.__init__" will use this as the base class instead of
  creating one. This allows customizing the metaclass used to
  construct the base. (#546)

* The undocumented "DeclarativeMeta" internals that the extension
  uses for binds and table name generation have been refactored to
  work as mixins. Documentation is added about how to create a custom
  metaclass that does not do table name generation. (#546)

* Model and metaclass code has been moved to a new "models" module.
  "_BoundDeclarativeMeta" is renamed to "DefaultMeta"; the old name
  will be removed in 3.0. (#546)

* Models have a default "repr" that shows the model name and primary
  key. (#530)

* Fixed a bug where using "init_app" would cause connectors to
  always use the "current_app" rather than the app they were created
  for. This caused issues when multiple apps were registered with the
  extension. (#547)


Version 2.2
===========

Released 2017-02-27, codename Dubnium

* Minimum SQLAlchemy version is 0.8 due to use of
  "sqlalchemy.inspect".

* Added support for custom "query_class" and "model_class" as args
  to the "SQLAlchemy" constructor. (#328)

* Allow listening to SQLAlchemy events on "db.session". (#364)

* Allow "__bind_key__" on abstract models. (#373)

* Allow "SQLALCHEMY_ECHO" to be a string. (#409)

* Warn when "SQLALCHEMY_DATABASE_URI" is not set. (#443)

* Don't let pagination generate invalid page numbers. (#460)

* Drop support of Flask < 0.10. This means the db session is always
  tied to the app context and its teardown event. (#461)

* Tablename generation logic no longer accesses class properties
  unless they are "declared_attr". (#467)


Version 2.1
===========

Released 2015-10-23, codename Caesium

* Table names are automatically generated in more cases, including
  subclassing mixins and abstract models.

* Allow using a custom MetaData object.

* Add support for binds parameter to session.


Version 2.0
===========

Released 2014-08-29, codename Bohrium

* Changed how the builtin signals are subscribed to skip non-Flask-
  SQLAlchemy sessions. This will also fix the attribute error about
  model changes not existing.

* Added a way to control how signals for model modifications are
  tracked.

* Made the "SignallingSession" a public interface and added a hook
  for customizing session creation.

* If the "bind" parameter is given to the signalling session it will
  no longer cause an error that a parameter is given twice.

* Added working table reflection support.

* Enabled autoflush by default.

* Consider "SQLALCHEMY_COMMIT_ON_TEARDOWN" harmful and remove from
  docs.


Version 1.0
===========

Released 2013-07-20, codename Aurum

* Added Python 3.3 support.

* Dropped 2.5 compatibility.

* Various bugfixes

* Changed versioning format to do major releases for each update
  now.


Version 0.16
============

* New distribution format (flask_sqlalchemy)

* Added support for Flask 0.9 specifics.


Version 0.15
============

* Added session support for multiple databases.


Version 0.14
============

* Make relative sqlite paths relative to the application root.


Version 0.13
============

* Fixed an issue with Flask-SQLAlchemy not selecting the correct
  binds.


Version 0.12
============

* Added support for multiple databases.

* Expose "BaseQuery" as "db.Query".

* Set default "query_class" for "db.relation", "db.relationship",
  and "db.dynamic_loader" to "BaseQuery".

* Improved compatibility with Flask 0.7.


Version 0.11
============

* Fixed a bug introduced in 0.10 with alternative table
  constructors.


Version 0.10
============

* Added support for signals.

* Table names are now automatically set from the class name unless
  overridden.

* "Model.query" now always works for applications directly passed to
  the "SQLAlchemy" constructor. Furthermore the property now raises a
  "RuntimeError" instead of being "None".

* Added session options to constructor.

* Fixed a broken "__repr__".

* "db.Table" is now a factory function that creates table objects.
  This makes it possible to omit the metadata.


Version 0.9
===========

* Applied changes to pass the Flask extension approval process.


Version 0.8
===========

* Added a few configuration keys for creating connections.

* Automatically activate connection recycling for MySQL connections.

* Added support for the Flask testing mode.


Version 0.7
===========

* Initial public release
