summaryrefslogtreecommitdiff
path: root/doc
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2022-12-05 18:14:49 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2022-12-05 18:14:49 -0500
commita11d8754d93f59332646e3e6258e2c560b47d7f8 (patch)
tree4b8e20717a3507a4a3bdd3ed53ac1c04904867a1 /doc
parent4a8e3b2cd16fd9d18386315fe4d3380c21a9f452 (diff)
downloadsqlalchemy-a11d8754d93f59332646e3e6258e2c560b47d7f8.tar.gz
- 2.0.0b4rel_2_0_0b4
Diffstat (limited to 'doc')
-rw-r--r--doc/build/changelog/changelog_20.rst319
-rw-r--r--doc/build/changelog/unreleased_20/6289.rst12
-rw-r--r--doc/build/changelog/unreleased_20/8667.rst9
-rw-r--r--doc/build/changelog/unreleased_20/8765.rst17
-rw-r--r--doc/build/changelog/unreleased_20/8770.rst13
-rw-r--r--doc/build/changelog/unreleased_20/8776.rst7
-rw-r--r--doc/build/changelog/unreleased_20/8777.rst9
-rw-r--r--doc/build/changelog/unreleased_20/8783.rst7
-rw-r--r--doc/build/changelog/unreleased_20/8796.rst12
-rw-r--r--doc/build/changelog/unreleased_20/8812.rst8
-rw-r--r--doc/build/changelog/unreleased_20/8822.rst19
-rw-r--r--doc/build/changelog/unreleased_20/8842.rst19
-rw-r--r--doc/build/changelog/unreleased_20/8847.rst11
-rw-r--r--doc/build/changelog/unreleased_20/8849.rst22
-rw-r--r--doc/build/changelog/unreleased_20/8853.rst8
-rw-r--r--doc/build/changelog/unreleased_20/8859.rst16
-rw-r--r--doc/build/changelog/unreleased_20/8878.rst22
-rw-r--r--doc/build/changelog/unreleased_20/8880.rst10
-rw-r--r--doc/build/changelog/unreleased_20/8884.rst12
-rw-r--r--doc/build/changelog/unreleased_20/8888.rst8
-rw-r--r--doc/build/changelog/unreleased_20/8905.rst10
-rw-r--r--doc/build/changelog/unreleased_20/8917.rst18
-rw-r--r--doc/build/changelog/unreleased_20/8925.rst17
-rw-r--r--doc/build/changelog/unreleased_20/8926.rst8
-rw-r--r--doc/build/conf.py4
25 files changed, 320 insertions, 297 deletions
diff --git a/doc/build/changelog/changelog_20.rst b/doc/build/changelog/changelog_20.rst
index 338dd5e1f..5a8b1e6d2 100644
--- a/doc/build/changelog/changelog_20.rst
+++ b/doc/build/changelog/changelog_20.rst
@@ -10,7 +10,324 @@
.. changelog::
:version: 2.0.0b4
- :include_notes_from: unreleased_20
+ :released: December 5, 2022
+
+ .. change::
+ :tags: usecase, orm
+ :tickets: 8859
+
+ Added support custom user-defined types which extend the Python
+ ``enum.Enum`` base class to be resolved automatically
+ to SQLAlchemy :class:`.Enum` SQL types, when using the Annotated
+ Declarative Table feature. The feature is made possible through new
+ lookup features added to the ORM type map feature, and includes support
+ for changing the arguments of the :class:`.Enum` that's generated by
+ default as well as setting up specific ``enum.Enum`` types within
+ the map with specific arguments.
+
+ .. seealso::
+
+ :ref:`orm_declarative_mapped_column_enums`
+
+ .. change::
+ :tags: bug, typing
+ :tickets: 8783
+
+ Adjusted internal use of the Python ``enum.IntFlag`` class which changed
+ its behavioral contract in Python 3.11. This was not causing runtime
+ failures however caused typing runs to fail under Python 3.11.
+
+ .. change::
+ :tags: usecase, typing
+ :tickets: 8847
+
+ Added a new type :class:`.SQLColumnExpression` which may be indicated in
+ user code to represent any SQL column oriented expression, including both
+ those based on :class:`.ColumnElement` as well as on ORM
+ :class:`.QueryableAttribute`. This type is a real class, not an alias, so
+ can also be used as the foundation for other objects. An additional
+ ORM-specific subclass :class:`.SQLORMExpression` is also included.
+
+
+ .. change::
+ :tags: bug, typing
+ :tickets: 8667, 6810
+
+ The ``sqlalchemy.ext.mutable`` extension and ``sqlalchemy.ext.automap``
+ extensions are now fully pep-484 typed. Huge thanks to Gleb Kisenkov for
+ their efforts on this.
+
+
+
+ .. change::
+ :tags: bug, sql
+ :tickets: 8849
+
+ The approach to the ``numeric`` pep-249 paramstyle has been rewritten, and
+ is now fully supported, including by features such as "expanding IN" and
+ "insertmanyvalues". Parameter names may also be repeated in the source SQL
+ construct which will be correctly represented within the numeric format
+ using a single parameter. Introduced an additional numeric paramstyle
+ called ``numeric_dollar``, which is specifically what's used by the asyncpg
+ dialect; the paramstyle is equivalent to ``numeric`` except numeric
+ indicators are indicated by a dollar-sign rather than a colon. The asyncpg
+ dialect now uses ``numeric_dollar`` paramstyle directly, rather than
+ compiling to ``format`` style first.
+
+ The ``numeric`` and ``numeric_dollar`` paramstyles assume that the target
+ backend is capable of receiving the numeric parameters in any order,
+ and will match the given parameter values to the statement based on
+ matching their position (1-based) to the numeric indicator. This is the
+ normal behavior of "numeric" paramstyles, although it was observed that
+ the SQLite DBAPI implements a not-used "numeric" style that does not honor
+ parameter ordering.
+
+ .. change::
+ :tags: usecase, postgresql
+ :tickets: 8765
+
+ Complementing :ticket:`8690`, new comparison methods such as
+ :meth:`_postgresql.Range.adjacent_to`,
+ :meth:`_postgresql.Range.difference`, :meth:`_postgresql.Range.union`,
+ etc., were added to the PG-specific range objects, bringing them in par
+ with the standard operators implemented by the underlying
+ :attr:`_postgresql.AbstractRange.comparator_factory`.
+
+ In addition, the ``__bool__()`` method of the class has been corrected to
+ be consistent with the common Python containers behavior as well as how
+ other popular PostgreSQL drivers do: it now tells whether the range
+ instance is *not* empty, rather than the other way around.
+
+ Pull request courtesy Lele Gaifax.
+
+ .. change::
+ :tags: bug, sql
+ :tickets: 8770
+
+ Adjusted the rendering of ``RETURNING``, in particular when using
+ :class:`_sql.Insert`, such that it now renders columns using the same logic
+ as that of the :class:`.Select` construct to generate labels, which will
+ include disambiguating labels, as well as that a SQL function surrounding a
+ named column will be labeled using the column name itself. This establishes
+ better cross-compatibility when selecting rows from either :class:`.Select`
+ constructs or from DML statements that use :meth:`.UpdateBase.returning`. A
+ narrower scale change was also made for the 1.4 series that adjusted the
+ function label issue only.
+
+ .. change::
+ :tags: change, postgresql, asyncpg
+ :tickets: 8926
+
+ Changed the paramstyle used by asyncpg from ``format`` to
+ ``numeric_dollar``. This has two main benefits since it does not require
+ additional processing of the statement and allows for duplicate parameters
+ to be present in the statements.
+
+ .. change::
+ :tags: bug, orm
+ :tickets: 8888
+
+ Fixed issue where use of an unknown datatype within a :class:`.Mapped`
+ annotation for a column-based attribute would silently fail to map the
+ attribute, rather than reporting an exception; an informative exception
+ message is now raised.
+
+ .. change::
+ :tags: bug, orm
+ :tickets: 8777
+
+ Fixed a suite of issues involving :class:`.Mapped` use with dictionary
+ types, such as ``Mapped[dict[str, str] | None]``, would not be correctly
+ interpreted in Declarative ORM mappings. Support to correctly
+ "de-optionalize" this type including for lookup in ``type_annotation_map``
+ has been fixed.
+
+ .. change::
+ :tags: feature, orm
+ :tickets: 8822
+
+ Added a new parameter :paramref:`_orm.mapped_column.use_existing_column` to
+ accommodate the use case of a single-table inheritance mapping that uses
+ the pattern of more than one subclass indicating the same column to take
+ place on the superclass. This pattern was previously possible by using
+ :func:`_orm.declared_attr` in conjunction with locating the existing column
+ in the ``.__table__`` of the superclass, however is now updated to work
+ with :func:`_orm.mapped_column` as well as with pep-484 typing, in a
+ simple and succinct way.
+
+ .. seealso::
+
+ :ref:`orm_inheritance_column_conflicts`
+
+
+
+
+ .. change::
+ :tags: bug, mssql
+ :tickets: 8917
+
+ Fixed regression caused by the combination of :ticket:`8177`, re-enable
+ setinputsizes for SQL server unless fast_executemany + DBAPI executemany is
+ used for a statement, along with :ticket:`6047`, implement
+ "insertmanyvalues", which bypasses DBAPI executemany in place of a custom
+ DBAPI execute for INSERT statements. setinputsizes would incorrectly not be
+ used for a multiple parameter-set INSERT statement that used
+ "insertmanyvalues" if fast_executemany were turned on, as the check would
+ incorrectly assume this is a DBAPI executemany call. The "regression"
+ would then be that the "insertmanyvalues" statement format is apparently
+ slightly more sensitive to multiple rows that don't use the same types
+ for each row, so in such a case setinputsizes is especially needed.
+
+ The fix repairs the fast_executemany check so that it only disables
+ setinputsizes if true DBAPI executemany is to be used.
+
+ .. change::
+ :tags: bug, orm, performance
+ :tickets: 8796
+
+ Additional performance enhancements within ORM-enabled SQL statements,
+ specifically targeting callcounts within the construction of ORM
+ statements, using combinations of :func:`_orm.aliased` with
+ :func:`_sql.union` and similar "compound" constructs, in addition to direct
+ performance improvements to the ``corresponding_column()`` internal method
+ that is used heavily by the ORM by constructs like :func:`_orm.aliased` and
+ similar.
+
+
+ .. change::
+ :tags: bug, postgresql
+ :tickets: 8884
+
+ Added additional type-detection for the new PostgreSQL
+ :class:`_postgresql.Range` type, where previous cases that allowed the
+ psycopg2-native range objects to be received directly by the DBAPI without
+ SQLAlchemy intercepting them stopped working, as we now have our own value
+ object. The :class:`_postgresql.Range` object has been enhanced such that
+ SQLAlchemy Core detects it in otherwise ambiguous situations (such as
+ comparison to dates) and applies appropriate bind handlers. Pull request
+ courtesy Lele Gaifax.
+
+ .. change::
+ :tags: bug, orm
+ :tickets: 8880
+
+ Fixed bug in :ref:`orm_declarative_native_dataclasses` feature where using
+ plain dataclass fields with the ``__allow_unmapped__`` directive in a
+ mapping would not create a dataclass with the correct class-level state for
+ those fields, copying the raw ``Field`` object to the class inappropriately
+ after dataclasses itself had replaced the ``Field`` object with the
+ class-level default value.
+
+ .. change::
+ :tags: usecase, orm extensions
+ :tickets: 8878
+
+ Added support for the :func:`.association_proxy` extension function to
+ take part within Python ``dataclasses`` configuration, when using
+ the native dataclasses feature described at
+ :ref:`orm_declarative_native_dataclasses`. Included are attribute-level
+ arguments including :paramref:`.association_proxy.init` and
+ :paramref:`.association_proxy.default_factory`.
+
+ Documentation for association proxy has also been updated to use
+ "Annotated Declarative Table" forms within examples, including type
+ annotations used for :class:`.AssocationProxy` itself.
+
+
+ .. change::
+ :tags: bug, typing
+
+ Corrected typing support for the :paramref:`_orm.relationship.secondary`
+ argument which may also accept a callable (lambda) that returns a
+ :class:`.FromClause`.
+
+ .. change::
+ :tags: bug, orm, regression
+ :tickets: 8812
+
+ Fixed regression where flushing a mapped class that's mapped against a
+ subquery, such as a direct mapping or some forms of concrete table
+ inheritance, would fail if the :paramref:`_orm.Mapper.eager_defaults`
+ parameter were used.
+
+ .. change::
+ :tags: bug, schema
+ :tickets: 8925
+
+ Stricter rules are in place for appending of :class:`.Column` objects to
+ :class:`.Table` objects, both moving some previous deprecation warnings to
+ exceptions, and preventing some previous scenarios that would cause
+ duplicate columns to appear in tables, when
+ :paramref:`.Table.extend_existing` were set to ``True``, for both
+ programmatic :class:`.Table` construction as well as during reflection
+ operations.
+
+ See :ref:`change_8925` for a rundown of these changes.
+
+ .. seealso::
+
+ :ref:`change_8925`
+
+ .. change::
+ :tags: usecase, orm
+ :tickets: 8905
+
+ Added :paramref:`_orm.mapped_column.compare` parameter to relevant ORM
+ attribute constructs including :func:`_orm.mapped_column`,
+ :func:`_orm.relationship` etc. to provide for the Python dataclasses
+ ``compare`` parameter on ``field()``, when using the
+ :ref:`orm_declarative_native_dataclasses` feature. Pull request courtesy
+ Simon Schiele.
+
+ .. change::
+ :tags: sql, usecase
+ :tickets: 6289
+
+ Added :class:`_expression.ScalarValues` that can be used as a column
+ element allowing using :class:`_expression.Values` inside ``IN`` clauses
+ or in conjunction with ``ANY`` or ``ALL`` collection aggregates.
+ This new class is generated using the method
+ :meth:`_expression.Values.scalar_values`.
+ The :class:`_expression.Values` instance is now coerced to a
+ :class:`_expression.ScalarValues` when used in a ``IN`` or ``NOT IN``
+ operation.
+
+ .. change::
+ :tags: bug, orm
+ :tickets: 8853
+
+ Fixed regression in 2.0.0b3 caused by :ticket:`8759` where indicating the
+ :class:`.Mapped` name using a qualified name such as
+ ``sqlalchemy.orm.Mapped`` would fail to be recognized by Declarative as
+ indicating the :class:`.Mapped` construct.
+
+ .. change::
+ :tags: bug, typing
+ :tickets: 8842
+
+ Improved the typing for :class:`.sessionmaker` and
+ :class:`.async_sessionmaker`, so that the default type of their return value
+ will be :class:`.Session` or :class:`.AsyncSession`, without the need to
+ type this explicitly. Previously, Mypy would not automaticaly infer these
+ return types from its generic base.
+
+ As part of this change, arguments for :class:`.Session`,
+ :class:`.AsyncSession`, :class:`.sessionmaker` and
+ :class:`.async_sessionmaker` beyond the initial "bind" argument have been
+ made keyword-only, which includes parameters that have always been
+ documented as keyword arguments, such as :paramref:`.Session.autoflush`,
+ :paramref:`.Session.class_`, etc.
+
+ Pull request courtesy Sam Bull.
+
+
+ .. change::
+ :tags: bug, typing
+ :tickets: 8776
+
+ Fixed issue where passing a callbale function returning an iterable
+ of column elements to :paramref:`_orm.relationship.order_by` was
+ flagged as an error in type checkers.
.. changelog::
:version: 2.0.0b3
diff --git a/doc/build/changelog/unreleased_20/6289.rst b/doc/build/changelog/unreleased_20/6289.rst
deleted file mode 100644
index 9bb7717a0..000000000
--- a/doc/build/changelog/unreleased_20/6289.rst
+++ /dev/null
@@ -1,12 +0,0 @@
-.. change::
- :tags: sql, usecase
- :tickets: 6289
-
- Added :class:`_expression.ScalarValues` that can be used as a column
- element allowing using :class:`_expression.Values` inside ``IN`` clauses
- or in conjunction with ``ANY`` or ``ALL`` collection aggregates.
- This new class is generated using the method
- :meth:`_expression.Values.scalar_values`.
- The :class:`_expression.Values` instance is now coerced to a
- :class:`_expression.ScalarValues` when used in a ``IN`` or ``NOT IN``
- operation.
diff --git a/doc/build/changelog/unreleased_20/8667.rst b/doc/build/changelog/unreleased_20/8667.rst
deleted file mode 100644
index 47f6ce541..000000000
--- a/doc/build/changelog/unreleased_20/8667.rst
+++ /dev/null
@@ -1,9 +0,0 @@
-.. change::
- :tags: bug, typing
- :tickets: 8667, 6810
-
- The ``sqlalchemy.ext.mutable`` extension and ``sqlalchemy.ext.automap``
- extensions are now fully pep-484 typed. Huge thanks to Gleb Kisenkov for
- their efforts on this.
-
-
diff --git a/doc/build/changelog/unreleased_20/8765.rst b/doc/build/changelog/unreleased_20/8765.rst
deleted file mode 100644
index 17ada62f8..000000000
--- a/doc/build/changelog/unreleased_20/8765.rst
+++ /dev/null
@@ -1,17 +0,0 @@
-.. change::
- :tags: usecase, postgresql
- :tickets: 8765
-
- Complementing :ticket:`8690`, new comparison methods such as
- :meth:`_postgresql.Range.adjacent_to`,
- :meth:`_postgresql.Range.difference`, :meth:`_postgresql.Range.union`,
- etc., were added to the PG-specific range objects, bringing them in par
- with the standard operators implemented by the underlying
- :attr:`_postgresql.AbstractRange.comparator_factory`.
-
- In addition, the ``__bool__()`` method of the class has been corrected to
- be consistent with the common Python containers behavior as well as how
- other popular PostgreSQL drivers do: it now tells whether the range
- instance is *not* empty, rather than the other way around.
-
- Pull request courtesy Lele Gaifax.
diff --git a/doc/build/changelog/unreleased_20/8770.rst b/doc/build/changelog/unreleased_20/8770.rst
deleted file mode 100644
index 4c8bd6e9b..000000000
--- a/doc/build/changelog/unreleased_20/8770.rst
+++ /dev/null
@@ -1,13 +0,0 @@
-.. change::
- :tags: bug, sql
- :tickets: 8770
-
- Adjusted the rendering of ``RETURNING``, in particular when using
- :class:`_sql.Insert`, such that it now renders columns using the same logic
- as that of the :class:`.Select` construct to generate labels, which will
- include disambiguating labels, as well as that a SQL function surrounding a
- named column will be labeled using the column name itself. This establishes
- better cross-compatibility when selecting rows from either :class:`.Select`
- constructs or from DML statements that use :meth:`.UpdateBase.returning`. A
- narrower scale change was also made for the 1.4 series that adjusted the
- function label issue only.
diff --git a/doc/build/changelog/unreleased_20/8776.rst b/doc/build/changelog/unreleased_20/8776.rst
deleted file mode 100644
index a8c1300e2..000000000
--- a/doc/build/changelog/unreleased_20/8776.rst
+++ /dev/null
@@ -1,7 +0,0 @@
-.. change::
- :tags: bug, typing
- :tickets: 8776
-
- Fixed issue where passing a callbale function returning an iterable
- of column elements to :paramref:`_orm.relationship.order_by` was
- flagged as an error in type checkers.
diff --git a/doc/build/changelog/unreleased_20/8777.rst b/doc/build/changelog/unreleased_20/8777.rst
deleted file mode 100644
index c6930f461..000000000
--- a/doc/build/changelog/unreleased_20/8777.rst
+++ /dev/null
@@ -1,9 +0,0 @@
-.. change::
- :tags: bug, orm
- :tickets: 8777
-
- Fixed a suite of issues involving :class:`.Mapped` use with dictionary
- types, such as ``Mapped[dict[str, str] | None]``, would not be correctly
- interpreted in Declarative ORM mappings. Support to correctly
- "de-optionalize" this type including for lookup in ``type_annotation_map``
- has been fixed.
diff --git a/doc/build/changelog/unreleased_20/8783.rst b/doc/build/changelog/unreleased_20/8783.rst
deleted file mode 100644
index 1d5da5028..000000000
--- a/doc/build/changelog/unreleased_20/8783.rst
+++ /dev/null
@@ -1,7 +0,0 @@
-.. change::
- :tags: bug, typing
- :tickets: 8783
-
- Adjusted internal use of the Python ``enum.IntFlag`` class which changed
- its behavioral contract in Python 3.11. This was not causing runtime
- failures however caused typing runs to fail under Python 3.11.
diff --git a/doc/build/changelog/unreleased_20/8796.rst b/doc/build/changelog/unreleased_20/8796.rst
deleted file mode 100644
index cd4f7457f..000000000
--- a/doc/build/changelog/unreleased_20/8796.rst
+++ /dev/null
@@ -1,12 +0,0 @@
-.. change::
- :tags: bug, orm, performance
- :tickets: 8796
-
- Additional performance enhancements within ORM-enabled SQL statements,
- specifically targeting callcounts within the construction of ORM
- statements, using combinations of :func:`_orm.aliased` with
- :func:`_sql.union` and similar "compound" constructs, in addition to direct
- performance improvements to the ``corresponding_column()`` internal method
- that is used heavily by the ORM by constructs like :func:`_orm.aliased` and
- similar.
-
diff --git a/doc/build/changelog/unreleased_20/8812.rst b/doc/build/changelog/unreleased_20/8812.rst
deleted file mode 100644
index a354ce0f9..000000000
--- a/doc/build/changelog/unreleased_20/8812.rst
+++ /dev/null
@@ -1,8 +0,0 @@
-.. change::
- :tags: bug, orm, regression
- :tickets: 8812
-
- Fixed regression where flushing a mapped class that's mapped against a
- subquery, such as a direct mapping or some forms of concrete table
- inheritance, would fail if the :paramref:`_orm.Mapper.eager_defaults`
- parameter were used.
diff --git a/doc/build/changelog/unreleased_20/8822.rst b/doc/build/changelog/unreleased_20/8822.rst
deleted file mode 100644
index c3f062ac9..000000000
--- a/doc/build/changelog/unreleased_20/8822.rst
+++ /dev/null
@@ -1,19 +0,0 @@
-.. change::
- :tags: feature, orm
- :tickets: 8822
-
- Added a new parameter :paramref:`_orm.mapped_column.use_existing_column` to
- accommodate the use case of a single-table inheritance mapping that uses
- the pattern of more than one subclass indicating the same column to take
- place on the superclass. This pattern was previously possible by using
- :func:`_orm.declared_attr` in conjunction with locating the existing column
- in the ``.__table__`` of the superclass, however is now updated to work
- with :func:`_orm.mapped_column` as well as with pep-484 typing, in a
- simple and succinct way.
-
- .. seealso::
-
- :ref:`orm_inheritance_column_conflicts`
-
-
-
diff --git a/doc/build/changelog/unreleased_20/8842.rst b/doc/build/changelog/unreleased_20/8842.rst
deleted file mode 100644
index 0d8b4cf0f..000000000
--- a/doc/build/changelog/unreleased_20/8842.rst
+++ /dev/null
@@ -1,19 +0,0 @@
-.. change::
- :tags: bug, typing
- :tickets: 8842
-
- Improved the typing for :class:`.sessionmaker` and
- :class:`.async_sessionmaker`, so that the default type of their return value
- will be :class:`.Session` or :class:`.AsyncSession`, without the need to
- type this explicitly. Previously, Mypy would not automaticaly infer these
- return types from its generic base.
-
- As part of this change, arguments for :class:`.Session`,
- :class:`.AsyncSession`, :class:`.sessionmaker` and
- :class:`.async_sessionmaker` beyond the initial "bind" argument have been
- made keyword-only, which includes parameters that have always been
- documented as keyword arguments, such as :paramref:`.Session.autoflush`,
- :paramref:`.Session.class_`, etc.
-
- Pull request courtesy Sam Bull.
-
diff --git a/doc/build/changelog/unreleased_20/8847.rst b/doc/build/changelog/unreleased_20/8847.rst
deleted file mode 100644
index b3842ac65..000000000
--- a/doc/build/changelog/unreleased_20/8847.rst
+++ /dev/null
@@ -1,11 +0,0 @@
-.. change::
- :tags: usecase, typing
- :tickets: 8847
-
- Added a new type :class:`.SQLColumnExpression` which may be indicated in
- user code to represent any SQL column oriented expression, including both
- those based on :class:`.ColumnElement` as well as on ORM
- :class:`.QueryableAttribute`. This type is a real class, not an alias, so
- can also be used as the foundation for other objects. An additional
- ORM-specific subclass :class:`.SQLORMExpression` is also included.
-
diff --git a/doc/build/changelog/unreleased_20/8849.rst b/doc/build/changelog/unreleased_20/8849.rst
deleted file mode 100644
index 23f05728a..000000000
--- a/doc/build/changelog/unreleased_20/8849.rst
+++ /dev/null
@@ -1,22 +0,0 @@
-.. change::
- :tags: bug, sql
- :tickets: 8849
-
- The approach to the ``numeric`` pep-249 paramstyle has been rewritten, and
- is now fully supported, including by features such as "expanding IN" and
- "insertmanyvalues". Parameter names may also be repeated in the source SQL
- construct which will be correctly represented within the numeric format
- using a single parameter. Introduced an additional numeric paramstyle
- called ``numeric_dollar``, which is specifically what's used by the asyncpg
- dialect; the paramstyle is equivalent to ``numeric`` except numeric
- indicators are indicated by a dollar-sign rather than a colon. The asyncpg
- dialect now uses ``numeric_dollar`` paramstyle directly, rather than
- compiling to ``format`` style first.
-
- The ``numeric`` and ``numeric_dollar`` paramstyles assume that the target
- backend is capable of receiving the numeric parameters in any order,
- and will match the given parameter values to the statement based on
- matching their position (1-based) to the numeric indicator. This is the
- normal behavior of "numeric" paramstyles, although it was observed that
- the SQLite DBAPI implements a not-used "numeric" style that does not honor
- parameter ordering.
diff --git a/doc/build/changelog/unreleased_20/8853.rst b/doc/build/changelog/unreleased_20/8853.rst
deleted file mode 100644
index 97d1f08ef..000000000
--- a/doc/build/changelog/unreleased_20/8853.rst
+++ /dev/null
@@ -1,8 +0,0 @@
-.. change::
- :tags: bug, orm
- :tickets: 8853
-
- Fixed regression in 2.0.0b3 caused by :ticket:`8759` where indicating the
- :class:`.Mapped` name using a qualified name such as
- ``sqlalchemy.orm.Mapped`` would fail to be recognized by Declarative as
- indicating the :class:`.Mapped` construct.
diff --git a/doc/build/changelog/unreleased_20/8859.rst b/doc/build/changelog/unreleased_20/8859.rst
deleted file mode 100644
index 85e4be422..000000000
--- a/doc/build/changelog/unreleased_20/8859.rst
+++ /dev/null
@@ -1,16 +0,0 @@
-.. change::
- :tags: usecase, orm
- :tickets: 8859
-
- Added support custom user-defined types which extend the Python
- ``enum.Enum`` base class to be resolved automatically
- to SQLAlchemy :class:`.Enum` SQL types, when using the Annotated
- Declarative Table feature. The feature is made possible through new
- lookup features added to the ORM type map feature, and includes support
- for changing the arguments of the :class:`.Enum` that's generated by
- default as well as setting up specific ``enum.Enum`` types within
- the map with specific arguments.
-
- .. seealso::
-
- :ref:`orm_declarative_mapped_column_enums`
diff --git a/doc/build/changelog/unreleased_20/8878.rst b/doc/build/changelog/unreleased_20/8878.rst
deleted file mode 100644
index 0c380e951..000000000
--- a/doc/build/changelog/unreleased_20/8878.rst
+++ /dev/null
@@ -1,22 +0,0 @@
-.. change::
- :tags: usecase, orm extensions
- :tickets: 8878
-
- Added support for the :func:`.association_proxy` extension function to
- take part within Python ``dataclasses`` configuration, when using
- the native dataclasses feature described at
- :ref:`orm_declarative_native_dataclasses`. Included are attribute-level
- arguments including :paramref:`.association_proxy.init` and
- :paramref:`.association_proxy.default_factory`.
-
- Documentation for association proxy has also been updated to use
- "Annotated Declarative Table" forms within examples, including type
- annotations used for :class:`.AssocationProxy` itself.
-
-
-.. change::
- :tags: bug, typing
-
- Corrected typing support for the :paramref:`_orm.relationship.secondary`
- argument which may also accept a callable (lambda) that returns a
- :class:`.FromClause`.
diff --git a/doc/build/changelog/unreleased_20/8880.rst b/doc/build/changelog/unreleased_20/8880.rst
deleted file mode 100644
index 0c5aeea1e..000000000
--- a/doc/build/changelog/unreleased_20/8880.rst
+++ /dev/null
@@ -1,10 +0,0 @@
-.. change::
- :tags: bug, orm
- :tickets: 8880
-
- Fixed bug in :ref:`orm_declarative_native_dataclasses` feature where using
- plain dataclass fields with the ``__allow_unmapped__`` directive in a
- mapping would not create a dataclass with the correct class-level state for
- those fields, copying the raw ``Field`` object to the class inappropriately
- after dataclasses itself had replaced the ``Field`` object with the
- class-level default value.
diff --git a/doc/build/changelog/unreleased_20/8884.rst b/doc/build/changelog/unreleased_20/8884.rst
deleted file mode 100644
index 0edbb9553..000000000
--- a/doc/build/changelog/unreleased_20/8884.rst
+++ /dev/null
@@ -1,12 +0,0 @@
-.. change::
- :tags: bug, postgresql
- :tickets: 8884
-
- Added additional type-detection for the new PostgreSQL
- :class:`_postgresql.Range` type, where previous cases that allowed the
- psycopg2-native range objects to be received directly by the DBAPI without
- SQLAlchemy intercepting them stopped working, as we now have our own value
- object. The :class:`_postgresql.Range` object has been enhanced such that
- SQLAlchemy Core detects it in otherwise ambiguous situations (such as
- comparison to dates) and applies appropriate bind handlers. Pull request
- courtesy Lele Gaifax.
diff --git a/doc/build/changelog/unreleased_20/8888.rst b/doc/build/changelog/unreleased_20/8888.rst
deleted file mode 100644
index 61b216804..000000000
--- a/doc/build/changelog/unreleased_20/8888.rst
+++ /dev/null
@@ -1,8 +0,0 @@
-.. change::
- :tags: bug, orm
- :tickets: 8888
-
- Fixed issue where use of an unknown datatype within a :class:`.Mapped`
- annotation for a column-based attribute would silently fail to map the
- attribute, rather than reporting an exception; an informative exception
- message is now raised.
diff --git a/doc/build/changelog/unreleased_20/8905.rst b/doc/build/changelog/unreleased_20/8905.rst
deleted file mode 100644
index 7f88f7fcd..000000000
--- a/doc/build/changelog/unreleased_20/8905.rst
+++ /dev/null
@@ -1,10 +0,0 @@
-.. change::
- :tags: usecase, orm
- :tickets: 8905
-
- Added :paramref:`_orm.mapped_column.compare` parameter to relevant ORM
- attribute constructs including :func:`_orm.mapped_column`,
- :func:`_orm.relationship` etc. to provide for the Python dataclasses
- ``compare`` parameter on ``field()``, when using the
- :ref:`orm_declarative_native_dataclasses` feature. Pull request courtesy
- Simon Schiele.
diff --git a/doc/build/changelog/unreleased_20/8917.rst b/doc/build/changelog/unreleased_20/8917.rst
deleted file mode 100644
index 37bee0d6b..000000000
--- a/doc/build/changelog/unreleased_20/8917.rst
+++ /dev/null
@@ -1,18 +0,0 @@
-.. change::
- :tags: bug, mssql
- :tickets: 8917
-
- Fixed regression caused by the combination of :ticket:`8177`, re-enable
- setinputsizes for SQL server unless fast_executemany + DBAPI executemany is
- used for a statement, along with :ticket:`6047`, implement
- "insertmanyvalues", which bypasses DBAPI executemany in place of a custom
- DBAPI execute for INSERT statements. setinputsizes would incorrectly not be
- used for a multiple parameter-set INSERT statement that used
- "insertmanyvalues" if fast_executemany were turned on, as the check would
- incorrectly assume this is a DBAPI executemany call. The "regression"
- would then be that the "insertmanyvalues" statement format is apparently
- slightly more sensitive to multiple rows that don't use the same types
- for each row, so in such a case setinputsizes is especially needed.
-
- The fix repairs the fast_executemany check so that it only disables
- setinputsizes if true DBAPI executemany is to be used.
diff --git a/doc/build/changelog/unreleased_20/8925.rst b/doc/build/changelog/unreleased_20/8925.rst
deleted file mode 100644
index 23c745385..000000000
--- a/doc/build/changelog/unreleased_20/8925.rst
+++ /dev/null
@@ -1,17 +0,0 @@
-.. change::
- :tags: bug, schema
- :tickets: 8925
-
- Stricter rules are in place for appending of :class:`.Column` objects to
- :class:`.Table` objects, both moving some previous deprecation warnings to
- exceptions, and preventing some previous scenarios that would cause
- duplicate columns to appear in tables, when
- :paramref:`.Table.extend_existing` were set to ``True``, for both
- programmatic :class:`.Table` construction as well as during reflection
- operations.
-
- See :ref:`change_8925` for a rundown of these changes.
-
- .. seealso::
-
- :ref:`change_8925`
diff --git a/doc/build/changelog/unreleased_20/8926.rst b/doc/build/changelog/unreleased_20/8926.rst
deleted file mode 100644
index 32381ebe3..000000000
--- a/doc/build/changelog/unreleased_20/8926.rst
+++ /dev/null
@@ -1,8 +0,0 @@
-.. change::
- :tags: change, postgresql, asyncpg
- :tickets: 8926
-
- Changed the paramstyle used by asyncpg from ``format`` to
- ``numeric_dollar``. This has two main benefits since it does not require
- additional processing of the statement and allows for duplicate parameters
- to be present in the statements.
diff --git a/doc/build/conf.py b/doc/build/conf.py
index db7979c99..3c188d655 100644
--- a/doc/build/conf.py
+++ b/doc/build/conf.py
@@ -236,9 +236,9 @@ copyright = "2007-2022, the SQLAlchemy authors and contributors" # noqa
# The short X.Y version.
version = "2.0"
# The full version, including alpha/beta/rc tags.
-release = "2.0.0b3"
+release = "2.0.0b4"
-release_date = "November 4, 2022"
+release_date = "December 5, 2022"
site_base = os.environ.get("RTD_SITE_BASE", "https://www.sqlalchemy.org")
site_adapter_template = "docs_adapter.mako"