<h1>Page Not Found</h1>
            <p>
              The page you requested does not exist. You may have followed a bad
              link, or the page may have been moved or removed.
            
Added in version 0.7: The static_url_path, static_folder, and template_folder
parameters were added.

Added in version 0.7: The use_cookies parameter was added as well as the ability
to override the client to be used by setting the
test_client_class attribute.

Changed in version 0.7: This no longer does the exception handling, this code was
moved to the new full_dispatch_request().

Changed in version 0.7: Teardown events for the request and app contexts are called
even if an unhandled error occurs. Other events may not be
called depending on when an error occurs during dispatch.
See callbacks-and-errors.

Added in version 0.7: Use register_error_handler() instead of modifying
error_handler_spec directly, for application wide error
handlers.

Added in version 0.7: One can now additionally also register custom exception types
that do not necessarily have to be a subclass of the
HTTPException class.

Changed in version 0.7: MIME guessing and etag support for file-like objects was
removed because it was unreliable. Pass a filename if you are
able to, otherwise attach an etag yourself.

Added in version 0.7: PROPAGATE_EXCEPTIONS, PRESERVE_CONTEXT_ON_EXCEPTION

Added in version 0.8: The instance_path and instance_relative_config parameters were
added.

Added in version 0.8: The provide_automatic_options functionality was added.

Added in version 0.8: TRAP_BAD_REQUEST_ERRORS, TRAP_HTTP_EXCEPTIONS,
APPLICATION_ROOT, SESSION_COOKIE_DOMAIN,
SESSION_COOKIE_PATH, SESSION_COOKIE_HTTPONLY,
SESSION_COOKIE_SECURE

Changed in version 0.11: Environment.auto_reload set in accordance with
TEMPLATES_AUTO_RELOAD configuration option.

Changed in version 0.11: Added **kwargs to support passing additional keyword arguments to
the constructor of test_client_class.

Changed in version 0.11: Added support for serializing top-level arrays. This was a
security risk in ancient browsers. See security-json.

Added in version 0.11: SESSION_REFRESH_EACH_REQUEST, TEMPLATES_AUTO_RELOAD,
LOGGER_HANDLER_POLICY, EXPLAIN_TEMPLATE_LOADING

Added in version 1.0: The host_matching and static_host parameters were added.

Added in version 1.0: The subdomain_matching parameter was added. Subdomain
matching needs to be enabled manually now. Setting
SERVER_NAME does not implicitly enable it.

Changed in version 1.0: SERVER_NAME no longer implicitly enables subdomain
matching. Use subdomain_matching instead.

Changed in version 1.0: If installed, python-dotenv will be used to load environment
variables from .env and .flaskenv files.The FLASK_DEBUG environment variable will override debug.Threaded mode is enabled by default.

Changed in version 1.0: Exceptions are looked up by code and by MRO, so
HTTPException subclasses can be handled with a catch-all
handler for the base HTTPException.

Changed in version 1.0: Key errors raised from request data like form show the
bad key in debug mode rather than a generic bad request
message.

Changed in version 1.0: Bad request errors are not trapped by default in debug mode.

Changed in version 1.0: JSON support is added to the response, like the request. This is useful
when testing to get the test client response data as JSON.

Changed in version 1.0: UTF-8 filenames as specified in RFC 2231 are supported.

Changed in version 1.0: If installed, python-dotenv will be used to load environment variables
from .env and .flaskenv files.

Changed in version 1.0: Does not implicitly enable subdomain_matching.

Changed in version 1.0: LOGGER_NAME and LOGGER_HANDLER_POLICY were removed. See
/logging for information about configuration.Added ENV to reflect the FLASK_ENV environment
variable.Added SESSION_COOKIE_SAMESITE to control the session
cookie's SameSite option.Added MAX_COOKIE_SIZE to control a warning from Werkzeug.

Changed in version 2.0: The default configuration is None instead of 12 hours.

Changed in version 2.0: For GET requests, only args are present, not form.

Changed in version 2.0: SHA-1 is used to generate the value. MD5 may not be
available in some environments.

Changed in version 2.0: Range processing is skipped if length is 0 instead of
raising a 416 Range Not Satisfiable error.

Changed in version 2.0: The request input stream is closed when calling
response.close(). Input streams for redirects are
automatically closed.

Changed in version 2.0: download_name replaces the attachment_filename
parameter. If as_attachment=False, it is passed with
Content-Disposition: inline instead.

Changed in version 2.0: max_age replaces the cache_timeout parameter.
conditional is enabled and max_age is not set by
default.

Changed in version 2.0: etag replaces the add_etags parameter. It can be a
string to use instead of generating one.

Changed in version 2.0: Passing a file-like object that inherits from
TextIOBase will raise a ValueError rather
than sending an empty file.

Added in version 2.0: Moved the implementation to Werkzeug. This is now a wrapper to
pass some Flask-specific arguments.

Changed in version 2.0: Writing to a binary file, and the encoding argument, will be
removed in Flask 2.1.

Changed in version 2.0: encoding will be removed in Flask 2.1. The data must be a
string or UTF-8 bytes.

Changed in version 2.0: encoding will be removed in Flask 2.1. The file must be text
mode, or binary mode with UTF-8 bytes.

Changed in version 2.0: The current directory is not changed to the location of the
loaded file.

Changed in version 2.0: When loading the env files, set the default encoding to UTF-8.

Changed in version 0.9: This can be called outside a request when the URL adapter is created
for an application context.

Changed in version 0.9: Previously a tuple was interpreted as the arguments for the
response object.

Changed in version 0.9: Previous to Werkzeug 0.9 this would only contain form data for POST
and PUT requests.

Changed in version 0.9: The stream is always set (but may be consumed) even if form parsing was
accessed first.

Changed in version 0.9: The _anchor and _method parameters were added.

Changed in version 0.9: Calls app.handle_url_build_error on build errors.

Changed in version 0.9: cache_timeout defaults to
Flask.get_send_file_max_age().

Changed in version 0.5: As of Flask 0.5 the functions registered for after request
execution are called in reverse order of registration.

Changed in version 0.5: This method now accepts the same arguments as
EnvironBuilder.  Because of this the
environ parameter is now called environ_overrides.

Changed in version 0.5: If a dict is provided as file in the dict for the data
parameter the content type has to be called content_type
instead of mimetype. This change was made for
consistency with werkzeug.FileWrapper.

Changed in version 0.5: The add_etags, cache_timeout and conditional
parameters were added. The default behavior is to add etags.

Changed in version 0.5: Autoescaping is no longer enabled for all templates.  The following
extensions for templates trigger autoescaping: .html, .htm,
.xml, .xhtml.  Templates loaded from a string will have
autoescaping disabled.

Changed in version 3.1: If SERVER_NAME is set, it does not restrict requests to
only that domain, for both subdomain_matching and
host_matching.

Changed in version 3.1: This is configurable through Flask config.

Changed in version 3.1: -e path takes precedence over default .env and .flaskenv files.

Changed in version 3.1: Added the load_dotenv_defaults parameter and attribute.

Changed in version 3.1: Added the load_defaults parameter. A given path takes precedence
over default files.

Changed in version 3.1: Does not restrict requests to only this domain, for both
subdomain_matching and host_matching.

Changed in version 0.6: This is configurable through Flask config.

Changed in version 0.6: Previously that function was called fix_headers and modified
the response object in place.  Also since 0.6, IRIs in location
and content-location headers are handled properly.Also starting with 0.6, Werkzeug will attempt to set the content
length if it is able to figure it out on its own.  This is the
case if all the strings in the response iterable are already
encoded and the iterable is buffered.

Changed in version 0.10: The default port is now picked from the SERVER_NAME
variable.

Changed in version 0.10: Bound to the application context instead of the request context.

Added in version 0.10: JSON_AS_ASCII, JSON_SORT_KEYS, JSONIFY_PRETTYPRINT_REGULAR

Changed in version 0.10: This is now always available, even in imported templates.

Changed in version 0.4: added support for with block usage for the client.

Changed in version 1.0.3: RoutingException, used internally for actions such as
 slash redirects during routing, is not passed to error
 handlers.

Changed in version 1.0.3: Filenames are encoded with ASCII instead of Latin-1 for broader
compatibility with WSGI servers.

Changed in version 1.0.3: app can be passed directly, rather than requiring an app
context for configuration.

Changed in version 1.1.0: Always passes the InternalServerError instance to the
handler, setting original_exception to the unhandled
error.

Changed in version 1.1.0: after_request functions and other finalization is done
even for the default 500 response when there is no handler.

Changed in version 1.1.0: This is a dict instead of an ImmutableDict to allow
easier configuration.

Changed in version 1.1.0: The logger takes the same name as name rather than
hard-coding "flask.app".

Changed in version 1.1.0: Returns False when python-dotenv is not installed, or when
the given path isn't a file.

Added in version 2.2: Moved from flask.url_for, which calls this method.

Changed in version 2.2: A generator will be converted to a streaming response.
A list will be converted to a JSON response.

Added in version 2.2: Moved from flask.redirect, which calls this method.

Changed in version 2.2: Autoescaping is now enabled by default for .svg files.

Added in version 2.2: Moved from flask.abort, which calls this object.

Changed in version 2.2: Calls current_app.url_for, allowing an app to override the
behavior.

Added in version 2.2: Calls current_app.aborter if available instead of always
using Werkzeug's default abort.

Added in version 2.2: Calls current_app.redirect if available instead of always
using Werkzeug's default redirect.

Changed in version 2.2: Calls current_app.json.response, allowing an app to override
the behavior.

Changed in version 2.2: Calls current_app.json.dumps, allowing an app to override

Changed in version 2.2: Calls current_app.json.dump, allowing an app to override

Changed in version 2.2: Calls current_app.json.loads, allowing an app to override

Changed in version 2.2: Calls current_app.json.load, allowing an app to override

Changed in version 2.2: The app parameter will be removed in Flask 2.3.

Changed in version 2.2: Added the init_every_request class attribute.

Changed in version 2.2: Added the -A/--app, --debug/--no-debug, -e/--env-file options.

Changed in version 2.2: An app context is pushed when running app.cli commands, so
@with_appcontext is no longer required for those commands.

Changed in version 2.2: The app context is active for subcommands as well as the
decorated callback. The app context is always available to
app.cli command and parameter callbacks.

Changed in version 1.1: A dict will be converted to a JSON response.

Changed in version 1.1: Passing a BytesIO object supports range requests.

Changed in version 1.1: The current session object is used instead of reloading the original
data. This prevents flask.session pointing to an out-of-date object.

Changed in version 1.0.0: Behavior was simplified. The logger is always named
"flask.app". The level is only set during configuration,
it doesn't check app.debug each time. Only one format is
used, not different ones depending on app.debug. No
handlers are removed, and a handler is only added if no
handlers are already configured.

Changed in version 2.0.1: The name option can be used to change the (pre-dotted)
name the blueprint is registered with. This allows the same
blueprint to be registered multiple times with unique names
for url_for.

Changed in version 2.0.1: Nested blueprints are registered with their dotted name.
This allows different blueprints with the same name to be
nested at different locations.

Changed in version 2.3: Nested blueprints now correctly apply subdomains.

Changed in version 2.3: Authorization is no longer a dict. The token attribute
was added for auth schemes that use a token instead of parameters.

Changed in version 2.3: Check max_content_length preemptively and while reading.

Changed in version 2.3: This attribute can be assigned to to set the header. A list can be assigned
to set multiple header values. Use del to unset the header.

Changed in version 2.3: WWWAuthenticate is no longer a dict. The token attribute
was added for auth challenges that use a token instead of parameters.

Changed in version 2.3: Not set by default, does not fall back to SERVER_NAME.

Changed in version 2.3: JSON_AS_ASCII, JSON_SORT_KEYS, JSONIFY_MIMETYPE, and
JSONIFY_PRETTYPRINT_REGULAR were removed. The default app.json provider has
equivalent attributes instead.

Changed in version 2.1: Registering the same blueprint with the same name multiple
times is an error.

Changed in version 2.1: Raise a 400 error if the content type is incorrect.

Changed in version 2.1: The built-in parser was removed. Set user_agent_class to a UserAgent
subclass to parse data from the string.

Changed in version 2.1: This is disabled by default, so responses will send relative
redirects.

Added in version 0.6.2: That attribute was previously called implicit_seqence_conversion.
(Notice the typo).  If you did use this feature, you have to adapt
your code to the name change.

Changed in version 0.12: app.test_client() includes preset default environment, which can be
set after instantiation of the app.test_client() object in
client.environ_base.

Changed in version 0.12: The filename is no longer automatically inferred from file
objects. If you want to use automatic MIME and etag support,
pass a filename via filename_or_fp or
attachment_filename.

Changed in version 0.12: attachment_filename is preferred over filename for MIME
detection.

Changed in version 2.0.2: decimal.Decimal is supported by converting to a string.

Added in version 3.10: Added PROVIDE_AUTOMATIC_OPTIONS to control the default
addition of autogenerated OPTIONS responses.

get_cookie_partitioned() (flask.sessions.SessionInterface method)

digest_method() (flask.sessions.SecureCookieSessionInterface static method)

key_derivation (flask.sessions.SecureCookieSessionInterface attribute)

serializer (flask.sessions.SecureCookieSessionInterface attribute)

session_class (flask.sessions.SecureCookieSessionInterface attribute)

open_session() (flask.sessions.SecureCookieSessionInterface method)

save_session() (flask.sessions.SecureCookieSessionInterface method)

default() (flask.json.provider.DefaultJSONProvider static method)

ensure_ascii (flask.json.provider.DefaultJSONProvider attribute)

first_registration (flask.blueprints.BlueprintSetupState attribute)

f-strings support = for self-documenting expressions and debugging

email.message.Message: Representing an email message using the compat32 API

What is the most efficient way to concatenate many strings together?

Why does a_tuple[i] += [‘item’] raise an exception when the addition works?

What does the slash(/) in the parameter list of a function mean?

Why am I getting an UnboundLocalError when the variable has a value?

PEP 3118: New memoryview implementation and buffer protocol documentation

PEP 476: Enabling certificate verification by default for stdlib http clients

PEP 471 - os.scandir() function – a better and faster directory iterator

PEP 655: Marking individual TypedDict items as required or not-required

Why must ‘self’ be used explicitly in method definitions and calls?

argparse — Parser for command-line options, arguments and subcommands

functools — Higher-order functions and operations on callable objects

importlib.resources – Package resource reading, opening and access

multiprocessing.shared_memory — Shared memory for direct access across processes

sysconfig — Provide access to Python’s configuration information

Serializable isolation / Savepoints / Transactional DDL (asyncio version)

Using awaitable-only driver methods in connection pool and other events

Avoiding transaction-related exceptions on Azure Synapse Analytics

Behavior of save-update cascade with bi-directional relationships

TextClause.columns() will match columns positionally, not by name, when passed positionally

JSON Columns will not insert JSON NULL if no value is supplied and no default is established

Session.get_bind() handles a wider variety of inheritance scenarios

session.expunge() will fully detach an object that’s been deleted

ColumnProperty constructs work a lot better with aliases, order_by

Session.get_bind() will receive the Mapper in all relevant Query cases

query.update() now resolves string names into mapped attribute names

Python-side defaults invoked for each row individually when using a multivalued insert

Warnings emitted when comparing objects with None values to relationships

A “negated contains or equals” relationship comparison will use the current value of attributes, not the database value

API Change for new Bundle feature when custom row loaders are used

Many-to-one backref checks for collection duplicates during remove operation

Support for SQL Comments on Table, Column, includes DDL, reflection

INSERT FROM SELECT now includes Python and SQL-expression defaults

A UNION or similar of SELECTs with LIMIT/OFFSET/ORDER BY now parenthesizes the embedded selects

attributes.get_history() will query from the DB by default if value not present

Schema identifiers now carry along their own quoting information

Subquery Eager Loading will apply DISTINCT to the innermost SELECT for some queries

Large parameter and row values are now truncated in logging and exception displays

The typing system now handles the task of rendering “literal bind” values

TypeDecorator now works with Enum, Boolean, “schema” types automatically

Support for RANGE and ROWS specification within window functions

Stringify of Query will consult the Session for the correct dialect

New Function features, “WITHIN GROUP”, array_agg and set aggregate functions

Event listeners can not be added or removed from within that event’s runner

PyODBC driver name is required with hostname-based SQL Server connections

SQLite/Oracle have distinct methods for temporary table/view name reporting

The .autoincrement directive is no longer implicitly enabled for a composite primary key column

Subqueries no longer applied to uselist=False joined eager loads

New options allowing explicit persistence of NULL over a default

The match() operator now returns an agnostic MatchType compatible with MySQL’s floating point return value

MySQL SET Type Overhauled to support empty sets, unicode, blank value handling

Specific checks added for passing mapped classes, instances as SQL literals

Constraints referring to unattached Columns can auto-attach to the Table when their referred columns are attached

AssociationProxy stores class-specific state on a per-class basis

Joined eager loading where the same entity is present multiple times in one row

Changes regarding “unhashable” types, impacts deduping of ORM rows

ResultSet column matching enhancements; positional column setup for textual SQL

Correct SQL Types are Established from Indexed Access of ARRAY, JSON, HSTORE

The JSON cast() operation now requires .astext is called explicitly

String / varlength types no longer represent “max” explicitly on reflection

JSON “null” is inserted as expected with ORM operations, omitted when not present

Same-named backrefs will not raise an error when applied to concrete inheritance subclasses

“Friendly” stringification of Core SQL constructs without a dialect

Hybrid properties and methods now propagate the docstring as well as .info

Improvements to the Query.correlate method with polymorphic entities

Erroneous “new instance X conflicts with persistent instance Y” flush errors fixed

Improved Session state when a SAVEPOINT is cancelled by the database

Fix involving many-to-one object moves with user-initiated foreign key manipulations

Non-native boolean integer values coerced to zero/one/None in all cases

Use flag_dirty() to mark an object as “dirty” without any attribute changing

AssociationProxy any(), has(), contains() work with chained association proxies

Engines now invalidate connections, run error handlers for BaseException

passive_deletes=’all’ will leave FK unchanged for object removed from collection

Fixed issue involving single-table inheritance with select_from()

A @validates method receives all values on bulk-collection set before comparison

The IN / NOT IN operator’s empty collection behavior is now configurable; default expression simplified

Hybrid attributes support reuse among subclasses, redefinition of @getter

Pessimistic disconnection detection added to the connection pool

The after_rollback() Session event now emits before the expiration of objects

New “selectin” eager loading, loads all collections at once using IN

“selectin” polymorphic loading, loads subclasses using separate IN queries

Late-expanded IN parameter sets allow IN expressions with cached statements

Support for fields specification in INTERVAL, including full reflection

TypeEngine methods bind_expression, column_expression work with Variant, type-specific types

The typing behavior of custom operators has been made consistent

Parameter helper for multi-valued INSERT with contextual default generator

Horizontal Sharding extension supports bulk update and delete methods

Added basic reflection support for PostgreSQL partitioned tables

National char datatypes de-emphasized for generic unicode, re-enabled with option

FOR UPDATE clause is rendered within the joined eager load subquery as well as outside

AssociationProxy now provides standard column operators for a column-oriented target

Many-to-one replacement won’t raise for “raiseload” or detached for “old” object

New parameters to affect IDENTITY start and increment, use of Sequence deprecated

Query.join() handles ambiguity in deciding the “left” side more explicitly

cx_Oracle connect arguments modernized, deprecated parameters removed

Major Architectural, Performance and API Enhancements for Database Reflection

Deprecation warnings are emitted for all deprecated elements; new deprecations added

Relationship to AliasedClass replaces the need for non primary mappers

Improved column labeling for simple column expressions using CAST or similar

Accessing an uninitialized collection attribute on a transient object no longer mutates __dict__

A SELECT statement is no longer implicitly considered to be a FROM clause

Transparent SQL Compilation Caching added to All DQL, DML Statements in Core, ORM

All IN expressions render parameters for each value in the list on the fly (e.g. expanding parameters)

Repaired internal importing conventions such that code linters may work correctly

The “New instance conflicts with existing identity” error is now a warning

RowProxy is no longer a “proxy”; is now called Row and behaves like an enhanced named tuple

Connection-level transactions can now be inactive based on subtransaction

Built-in FROM linting will warn for any potential cartesian products in a SELECT statement

SELECT objects and derived FROM clauses allow for duplicate columns and column labels

New “post compile” bound parameters used for LIMIT/OFFSET in Oracle, SQL Server

Removed “join rewriting” logic from SQLite dialect; updated imports

Python division operator performs true division for all backends; added floor division

Persistence-related cascade operations disallowed with viewonly=True

Python Dataclasses, attrs Supported w/ Declarative, Imperative Mappings

DATE, TIME, DATETIME datatypes now support literal rendering on all backends

Stricter behavior when querying inheritance mappings using custom queries

ORM Query is internally unified with select, update, delete; 2.0 style execution available

ORM Batch inserts with psycopg2 now batch statements with RETURNING in most cases

Enum and Boolean datatypes no longer default to “create constraint”

psycopg2 dialect features “execute_values” with RETURNING for INSERT statements by default

New Oracle FLOAT type with binary precision; decimal precision not accepted directly

Python 3.6 is the minimum Python 3 version; Python 2.7 still supported

psycopg2 dialect no longer has limitations regarding bound parameter names

Optimized ORM bulk insert now implemented for all backends other than MySQL

“with_variant()” clones the original TypeEngine rather than changing the type

match() operator on PostgreSQL uses plainto_tsquery() rather than to_tsquery()

New RANGE / MULTIRANGE support and changes for PostgreSQL backends

The Sequence construct reverts to not having any explicit default “start” value; impacts MS SQL Server

Session raises proactively when illegal concurrent or reentrant access is detected

ORM-enabled Insert, Upsert, Update and Delete Statements, with ORM RETURNING

Column loaders such as deferred(), with_expression() only take effect when indicated on the outermost, full entity query

Stricter rules for replacement of Columns in Table objects with same-names, keys

ORM Declarative Applies Column Orders Differently; Control behavior using sort_order

Many Core and ORM statement objects now perform much of their construction and validation in the compile phase

No more generation of an implicit KEY for composite primary key w/ AUTO_INCREMENT

ORM Bulk Update and Delete use RETURNING for “fetch” strategy when available

select().join() and outerjoin() add JOIN criteria to the current query, rather than creating a subquery

ORM Session.execute() uses “future” style Result sets in all cases

Applying Load, Persistence and Mapping Options for Imperative Table Columns

Routing Explicit Joins/Statements into Eagerly Loaded Collections

Fine grained control over cx_Oracle data binding performance with setinputsizes

What are default, default_factory and insert_default and what should I use?

Disabling or using an alternate dictionary to cache some (or all) statements

Using Lambdas to add significant speed gains to statement production

Streaming with a dynamically growing buffer using stream_results

QueuePool limit of size <x> overflow <y> reached, connection timed out, timeout <z>

This Session’s transaction has been rolled back due to a previous exception during flush

Expected FROM clause, got Select.  To create a FROM clause, use the .subquery() method

This connection is on an inactive transaction.  Please rollback() fully before proceeding

Can’t reconnect until invalid transaction is rolled back.  Please rollback() fully before proceeding

The <some function> in SQLAlchemy 2.0 will no longer <something>

For relationship <relationship>, delete-orphan cascade is normally configured only on the “one” side of a one-to-many relationship, and not on the “many” side of a many-to-one or many-to-many relationship.

Instance <instance> is already associated with an instance of <instance> via its <attribute> attribute, and is only allowed a single parent.

Parent instance <x> is not bound to a Session; (lazy load/deferred load/refresh/etc.) operation cannot proceed

per-row ORM Bulk Update by Primary Key requires that records contain primary key values

select() construct created in “legacy” mode; keyword arguments, etc.

A bind was located via legacy bound metadata, but since future=True is set on this Session, this bind is ignored.

A value is required for bind parameter <x> (in parameter group <y>)

When transforming <cls> to a dataclass, attribute(s) originate from superclass <cls> which is not a dataclass.

Python dataclasses error encountered when creating dataclass for <classname>

Compiler StrSQLCompiler can’t render element of type <element type>

Object cannot be converted to ‘persistent’ state, as this identity map is no longer valid.

relationship X will copy column Q to column P, which conflicts with relationship(s): ‘Y’

An alias is being generated automatically due to overlapping tables

Type annotation can’t be interpreted for Annotated Declarative Table form

I’m getting an error about greenlet not being installed when I try to use asyncio

I’m getting a warning or error about “Implicitly combining column X under attribute Y”

Using DBAPI Autocommit Allows for a Readonly Version of Transparent Reconnect

Why does post_update emit UPDATE in addition to the first UPDATE?

My Query does not return the same number of objects as query.count() tells me - why?

I’m re-loading data with my Session but it isn’t seeing changes that I committed elsewhere

“This Session’s transaction has been rolled back due to a previous exception during flush.” (or similar)

I’m using op() to generate a custom operator and my parenthesis are not coming out correctly

Why are percent signs being doubled up when stringifying SQL statements?

How do I render SQL expressions as strings, possibly with bound parameters inlined?

Why is ORDER BY recommended with LIMIT (especially with subqueryload())?

Floating Point String-Conversion Precision Configurable for Native Floating Point Types

Select/Query LIMIT / OFFSET may be specified as an arbitrary SQL expression

Improvements to declarative mixins, @declared_attr and related features

The use_alter flag on ForeignKeyConstraint is (usually) no longer needed

Many JOIN and LEFT OUTER JOIN expressions will no longer be wrapped in (SELECT * FROM ..) AS ANON_1

Identity Columns (GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY)

Dealing with Key Mutations and back-populating for Dictionary collections

The consideration of a “pending” object as an “orphan” has been made more aggressive

create_all() and drop_all() will now honor an empty list as such

Label constructs can now render as their name alone in an ORDER BY

Columns can reliably get their type from a column referred to via ForeignKey

select() no longer accepts varied constructor arguments, columns are passed positionally

Library-level (but not driver level) “Autocommit” removed from both Core and ORM

“Implicit” and “Connectionless” execution, “bound metadata” removed

ORM Query  - Joining / loading on relationships uses attributes, not strings

Using DISTINCT with additional columns, but only select the entity

Selecting from the query itself as a subquery, e.g. “from_self()”

Migration to 2.0 Step Seven - Test against a SQLAlchemy 2.0 Release

Migration to 2.0 Step Six - Add __allow_unmapped__ to explicitly typed ORM models

_query.Query.select_from() no longer applies the clause to corresponding entities

Improved rendering of Boolean constants, NULL constants, conjunctions

Composite attributes are now returned as their object form when queried on a per-attribute basis

viewonly=True on relationship() prevents history from taking effect

A bindparam() construct with no type gets upgraded via copy when a type is available

The “password” portion of a create_engine() no longer considers the + sign as an encoded space

PostgreSQL CREATE TYPE <x> AS ENUM now applies quoting to values

Right inner join nesting now the default for joinedload with innerjoin=True

Priority of attribute changes on relationship-bound attributes vs. FK-bound may appear to change

Changes to attribute events and other operations regarding attributes that have no pre-existing value

Change to single-table-inheritance criteria when using from_self(), count()

single-table-inheritance criteria added to all ON clauses unconditionally

Joined/Subquery eager loading explicitly disallowed with yield_per

Using _orm.declared_attr() to generate table-specific inheriting columns

“Commands out of sync; you can’t run this command now” / “This result object does not return rows. It has been closed automatically”

Rendering ON UPDATE CURRENT TIMESTAMP for MySQL / MariaDB’s explicit_defaults_for_timestamp

I’m getting errors related to “numpy.int64”, “numpy.bool_”, etc.

Fine grained control over python-oracledb data binding with setinputsizes

Setting Load and Persistence Options for Declarative Mapped Columns

Applying ORM Mappings to an existing dataclass (legacy dataclass use)

Mapping pre-existing dataclasses using Declarative With Imperative Table

Using Annotated Declarative Table (Type Annotated Forms for mapped_column())

mapped_column() derives the datatype and nullability from the Mapped annotation

Mixing in _orm.column_property() and other _orm.MapperProperty classes

Using a late-evaluated form for the “secondary” argument of many-to-many

Appending additional columns to an existing Declarative mapped class

Using INSERT, UPDATE and ON CONFLICT (i.e. upsert) to return ORM Objects

Creating Indexes and Constraints with Naming Conventions on Mixins

Disabling Bulk ORM Update by Primary Key for an UPDATE statement with multiple parameter sets

UPDATE/DELETE with Custom WHERE Criteria for Joined Table Inheritance

Applying loader options when selectin_polymorphic is itself a sub-option

Applying loader options to the subclasses loaded by selectin_polymorphic

Table values, Table and Column valued functions, Row and Tuple objects

Inspecting entities and columns from ORM-enabled SELECT and DML statements

Interaction of Schema-qualified Reflection with the Default Schema

Notes on Delete - Deleting Objects Referenced from Collections and Scalar Relationships

Joining a Session into an External Transaction (such as for test suites)

Is the Session thread-safe?  Is AsyncSession safe to share in concurrent tasks?

When do I construct a Session, when do I commit it, and when do I close it?

Partitioning Strategies (e.g. multiple database backends per Session)

Marking Implicitly Generated Values, timestamps, and Triggered Columns

Column Valued Functions - Table Valued Function as a Scalar Column

Using “UPPERCASE” and Backend-specific types for multiple backends