]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/log
thirdparty/sqlalchemy/sqlalchemy.git
3 years agocherry-pick changelog from 1.4.28
Mike Bayer [Thu, 9 Dec 2021 19:50:36 +0000 (14:50 -0500)] 
cherry-pick changelog from 1.4.28

3 years agoMerge branch 'typos-fixes' into main_gerrit
Federico Caselli [Thu, 9 Dec 2021 19:24:38 +0000 (20:24 +0100)] 
Merge branch 'typos-fixes' into main_gerrit

Change-Id: I32a4c97add07a3fe7d2d5cc4f1cd263b2042e123

3 years agoimplement attributes.Proxy._clone()
Mike Bayer [Thu, 9 Dec 2021 17:51:43 +0000 (12:51 -0500)] 
implement attributes.Proxy._clone()

Fixed issue where the internal cloning used by the
:meth:`_orm.PropComparator.any` method on a :func:`_orm.relationship` in
the case where the related class also makes use of ORM polymorphic loading,
would fail if a hybrid property on the related, polymorphic class were used
within the criteria for the ``any()`` operation.

Fixes: #7425
Change-Id: I5f4f4ec5fab17df228bc6e3de412d24114b20600

3 years agochangelog updates
Mike Bayer [Thu, 9 Dec 2021 17:36:25 +0000 (12:36 -0500)] 
changelog updates

Change-Id: Ie136cfb7375e68b2badba1099b5b041f99da85fa

3 years agoFix typo in docstring 7417/head
Lele Gaifax [Thu, 9 Dec 2021 07:14:06 +0000 (08:14 +0100)] 
Fix typo in docstring

3 years agoFix typo in changelog
Lele Gaifax [Thu, 9 Dec 2021 07:13:42 +0000 (08:13 +0100)] 
Fix typo in changelog

3 years agoinclude correct notes for 2.0
Mike Bayer [Wed, 8 Dec 2021 18:55:32 +0000 (13:55 -0500)] 
include correct notes for 2.0

the changelog_20 file either started out wrong
or got changed at some point to include the wrong change notes,
so the unreleased_20/ notes were not being displayed.

Change-Id: Iecb0db86ba5c6bacf4f8fdf8876dc411f357d6df

3 years agoMerge "Warn when caching is disabled / document" into main
mike bayer [Tue, 7 Dec 2021 15:46:54 +0000 (15:46 +0000)] 
Merge "Warn when caching is disabled / document" into main

3 years agoMerge "contextmanager skips rollback if trans says to skip it" into main
mike bayer [Tue, 7 Dec 2021 14:52:55 +0000 (14:52 +0000)] 
Merge "contextmanager skips rollback if trans says to skip it" into main

3 years agoMerge "Add __copy__, __deepcopy__ to URL. Fixes: #7400" into main
mike bayer [Mon, 6 Dec 2021 23:29:11 +0000 (23:29 +0000)] 
Merge "Add __copy__, __deepcopy__ to URL. Fixes: #7400" into main

3 years agoWarn when caching is disabled / document
Mike Bayer [Fri, 3 Dec 2021 19:04:05 +0000 (14:04 -0500)] 
Warn when caching is disabled / document

This patch adds new warnings for all elements that
don't indicate their caching behavior, including user-defined
ClauseElement subclasses and third party dialects.
it additionally adds new documentation to discuss an apparent
performance degradation in 1.4 when caching is disabled as a
result in the significant expense incurred by ORM
lazy loaders, which in 1.3 used BakedQuery so were actually
cached.

As a result of adding the warnings, a fair degree of
lesser used SQL expression objects identified that they did not
define caching behavior so would have been producing
``[no key]``, including PostgreSQL constructs ``hstore``
and ``array``.  These have been amended to use inherit
cache where appropriate.  "on conflict" constructs in
PostgreSQL, MySQL, SQLite still explicitly don't generate
a cache key at this time.

The change also adds a test for all constructs via
assert_compile() to assert they will not generate cache
warnings.

Fixes: #7394
Change-Id: I85958affbb99bfad0f5efa21bc8f2a95e7e46981

3 years agoAdd __copy__, __deepcopy__ to URL. Fixes: #7400
Tom Ritchford [Sun, 5 Dec 2021 18:27:45 +0000 (13:27 -0500)] 
Add __copy__, __deepcopy__ to URL. Fixes: #7400

Added support for ``copy()`` and ``deepcopy()`` to the :class:`_url.URL`
class. Pull request courtesy Tom Ritchford.

Fixes: #7400
Closes: #7401
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/7401
Pull-request-sha: a2c1b8992f5d153c6210178cda47b8ae96b91fb5

Change-Id: I55977338b2655a7d4f733ae786d31e589185e9ca

3 years agocontextmanager skips rollback if trans says to skip it
Mike Bayer [Thu, 2 Dec 2021 00:27:25 +0000 (19:27 -0500)] 
contextmanager skips rollback if trans says to skip it

Fixed issue where if an exception occurred when the :class:`_orm.Session`
were to close the connection within the :meth:`_orm.Session.commit` method,
when using a context manager for :meth:`_orm.Session.begin` , it would
attempt a rollback which would not be possible as the :class:`_orm.Session`
was in between where the transaction is committed and the connection is
then to be returned to the pool, raising the exception "this
sessiontransaction is in the committed state". This exception can occur
mostly in an asyncio context where CancelledError can be raised.

Fixes: #7388
Change-Id: I1a85a3a7eae79f3553ddf1e3d245a0d90b0a2f40

3 years agoqualify the stringification warning
Mike Bayer [Mon, 6 Dec 2021 17:41:36 +0000 (12:41 -0500)] 
qualify the stringification warning

the recipe which uses render_postcompile itself is
not insecure as it still renders bound parameters
and does not stringify any literal values.

Change-Id: Ib5ac2f7ce37dc1415a67b117a9c31c0ee37270b3

3 years agofix typo in exists documentation
Federico Caselli [Sun, 5 Dec 2021 21:14:09 +0000 (22:14 +0100)] 
fix typo in exists documentation

Change-Id: I44d8d6ee4816052a8dda64c00905b17b7ad8698e

3 years agoMerge "The where method of exists now accepts multiple cluase." into main
mike bayer [Sun, 5 Dec 2021 19:24:12 +0000 (19:24 +0000)] 
Merge "The where method of exists now accepts multiple cluase." into main

3 years agoRemove reference in docs to ThreadLocalMetaData which was removed
Federico Caselli [Sat, 4 Dec 2021 22:14:10 +0000 (23:14 +0100)] 
Remove reference in docs to ThreadLocalMetaData which was removed
in e88dc004e6bcd1418cb8eb811d0aa580c2a44b8f

Change-Id: I1ec3131b35ff62ccc8dc5489238b11d70623cbdc

3 years agoThe where method of exists now accepts multiple cluase.
Federico Caselli [Sat, 4 Dec 2021 22:08:05 +0000 (23:08 +0100)] 
The where method of exists now accepts multiple cluase.

Support multiple clause elements in the :meth:`_sql.Exists.where` method,
unifying the api with the on presented by a normal :func:`_sql.select`
construct.

Fixes: #7386
Change-Id: I5df20478008cd5167053d357cbfad8a641c62b44

3 years agoMerge "Removals: MetaData.bind, Table.bind, all other .bind" into main
mike bayer [Fri, 3 Dec 2021 15:35:13 +0000 (15:35 +0000)] 
Merge "Removals: MetaData.bind, Table.bind, all other .bind" into main

3 years agoMerge "copy list for __iadd__" into main
mike bayer [Fri, 3 Dec 2021 15:34:37 +0000 (15:34 +0000)] 
Merge "copy list for __iadd__" into main

3 years agocopy list for __iadd__
Mike Bayer [Thu, 2 Dec 2021 02:39:59 +0000 (21:39 -0500)] 
copy list for __iadd__

Fixed issue where a list mapped with :func:`_orm.relationship` would go
into an endless loop if in-place added to itself, i.e. the ``+=`` operator
were used, as well as if ``.extend()`` were given the same list.

Fixes: #7389
Change-Id: Idd5118420f8bc684d1ee36b2b6d4c5812f36cc4c

3 years agoMerge "Add __class_getitem__ to the declarative Base class" into main
mike bayer [Thu, 2 Dec 2021 19:51:42 +0000 (19:51 +0000)] 
Merge "Add __class_getitem__ to the declarative Base class" into main

3 years agoRemovals: MetaData.bind, Table.bind, all other .bind
Mike Bayer [Wed, 1 Dec 2021 15:53:16 +0000 (10:53 -0500)] 
Removals: MetaData.bind, Table.bind, all other .bind

Change-Id: I1ef2eb2018f4b68825fe40a2a8d99084cf217b35
References: #7257

3 years agofix typo in documentation
Federico Caselli [Wed, 1 Dec 2021 22:50:13 +0000 (23:50 +0100)] 
fix typo in documentation

Change-Id: I620977b0665d9b3c2cc9ade9db475c357f537ff9

3 years agoAdd __class_getitem__ to the declarative Base class
Kai Mueller [Wed, 1 Dec 2021 15:58:40 +0000 (10:58 -0500)] 
Add __class_getitem__ to the declarative Base class

Fixed issue where the :func:`_orm.as_declarative` decorator and similar
functions used to generate the declarative base class would not copy the
``__class_getitem__()`` method from a given superclass, which prevented the
use of pep-484 generics in conjunction with the ``Base`` class. Pull
request courtesy Kai Mueller.

Fixes: #7368
Closes: #7381
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/7381
Pull-request-sha: 7db7fd869a6bb617f767fad5b71ddf7cb5f14ff5

Change-Id: I495718c3082ad6dd2c83fdbf6feba7c529e351cb

3 years agoMerge "Fixes: #4390" into main
mike bayer [Tue, 30 Nov 2021 15:54:29 +0000 (15:54 +0000)] 
Merge "Fixes: #4390" into main

3 years agoMerge "document get_bind() overrides for async session" into main
mike bayer [Tue, 30 Nov 2021 15:48:55 +0000 (15:48 +0000)] 
Merge "document get_bind() overrides for async session" into main

3 years agoscoped_session adjustments
Mike Bayer [Tue, 30 Nov 2021 14:06:29 +0000 (09:06 -0500)] 
scoped_session adjustments

* fix typo, change to a note the async scoped session note
* more dragons re: threading.local()

Change-Id: I76266507510e4014456d992656f4aadf6d03ba4a

3 years agoMerge "adapt pytest plugin to support pytest v7" into main
mike bayer [Mon, 29 Nov 2021 23:07:21 +0000 (23:07 +0000)] 
Merge "adapt pytest plugin to support pytest v7" into main

3 years agodocument get_bind() overrides for async session
Mike Bayer [Mon, 29 Nov 2021 22:00:21 +0000 (17:00 -0500)] 
document get_bind() overrides for async session

Change-Id: Ifcc936a5861d49857d1f365416190cfbd0981aac
References: #7383

3 years agoadapt pytest plugin to support pytest v7
Federico Caselli [Sat, 27 Nov 2021 08:53:29 +0000 (09:53 +0100)] 
adapt pytest plugin to support pytest v7

Implemented support for the test suite to run correctly under Pytest 7.
Previously, only Pytest 6.x was supported for Python 3, however the version
was not pinned on the upper bound in tox.ini. Pytest is not pinned in
tox.ini to be lower than version 8 so that SQLAlchemy versions released
with the current codebase will be able to be tested under tox without
changes to the environment.   Much thanks to the Pytest developers for
their help with this issue.

Change-Id: I3b12166199be2b913ee16e78b3ebbff415654396

3 years agoMerge "provide connectionfairy on initialize" into main
mike bayer [Mon, 29 Nov 2021 20:59:41 +0000 (20:59 +0000)] 
Merge "provide connectionfairy on initialize" into main

3 years agoprovide connectionfairy on initialize
Mike Bayer [Fri, 26 Nov 2021 15:17:38 +0000 (10:17 -0500)] 
provide connectionfairy on initialize

This is so that dialect methods that are called within init
can assume the same argument structure as when they are called
in other places; we can nail down the type of object as well.

This change seems to mostly impact the isolation level routines
in the dialects, as these are called during initialize()
as well as on established connections.  these methods can now
assume a non-proxied DBAPI connection object in all cases,
as it is commonly required that attributes like ".autocommit"
are set on the object which don't work well in a proxied
situation.

Other changes:

* adds an interface for the "connectionfairy" concept
  called PoolProxiedConnection.
* Removes ``Connectable`` superclass of Connection.
  ``Connectable`` was originally meant to provide for the
  "method which accepts connection or engine" theme.  As this
  pattern  is greatly reduced in 2.0 and Engine no longer extends
  from it, the ``Connectable`` superclass doesnt serve any real
  purpose.

Leading from that, to set this in I also applied pep 484 annotations
to the Dialect base, and then in the interests of seeing some
of the typing information show up in my IDE did a little bit for Engine,
Connection and others.  I hope that it's feasible that we can
add annotations to specific classes and attributes ahead of when we
actually try to mass-populate the whole library.  This was
the original spirit of pep-484 that we can apply annotations
gradually.  I do of course want to try to do a mass-populate
although i think even in that case we will end up doing a lot
of manual work anyway (in particular for the changes here which
are distinct from what the stubs have).

Fixes: #7122
Change-Id: I5dd7fbff8a7ae520a81c165091af12a6a68826db

3 years agoupdate migration strategy for dynamic loaders
Mike Bayer [Sat, 27 Nov 2021 19:29:00 +0000 (14:29 -0500)] 
update migration strategy for dynamic loaders

discuss the two current ways for this use case that
use 2.0 style querying and introduce that a newer API
is likely on the way.

Also repair autofunctions for with_parent for 2.0 only.

References: #7123
References: #7372

Change-Id: I2ff6cfd780540ee4ee887b61137af7afa1327a9f

3 years agoFix a typo in psycopg_async module name (#7369)
Denis Laxalde [Sat, 27 Nov 2021 10:09:57 +0000 (11:09 +0100)] 
Fix a typo in psycopg_async module name (#7369)

3 years ago"graceful fetch" test should....clean up gracefully!
Mike Bayer [Fri, 26 Nov 2021 23:43:23 +0000 (18:43 -0500)] 
"graceful fetch" test should....clean up gracefully!

this test was relying on gc to close out the connection.
this would lead to problems with aiosqlite as we invalidate
async connetions that aren't gracefully closed, and this test
suite was create tables per suite, so we'd get into a spot where
a new sqlite memory connection without the tables would get set up.

would only occur for full test run + -n2 + C extensions + python 3.7,
but we assume that is all related to just getting gc to trigger
or not trigger at exactly the right moment in this situation.

confirmed if we add a gc.collect() to the test without explcitly
closing out the conenction, the connection is gc'ed and detached,
and we get the error reproduced on the subsequent test.

Change-Id: Icc9d4bc703f0842c27600f532f34bc4c7d3baf21

3 years agoAdded support for ``psycopg`` dialect.
Federico Caselli [Tue, 14 Sep 2021 21:38:00 +0000 (23:38 +0200)] 
Added support for ``psycopg`` dialect.

Both sync and async versions are supported.

Fixes: #6842
Change-Id: I57751c5028acebfc6f9c43572562405453a2f2a4

3 years agoMerge "propose emulated setinputsizes embedded in the compiler" into main
mike bayer [Thu, 25 Nov 2021 18:22:59 +0000 (18:22 +0000)] 
Merge "propose emulated setinputsizes embedded in the compiler" into main

3 years agoMerge "Clean up most py3k compat" into main
mike bayer [Thu, 25 Nov 2021 14:46:33 +0000 (14:46 +0000)] 
Merge "Clean up most py3k compat" into main

3 years agoClean up most py3k compat
Federico Caselli [Sun, 21 Nov 2021 20:17:27 +0000 (21:17 +0100)] 
Clean up most py3k compat

Change-Id: I8172fdcc3103ff92aa049827728484c8779af6b7

3 years agoTry fixing ``ORMExecuteState`` again.
Federico Caselli [Wed, 24 Nov 2021 20:01:54 +0000 (21:01 +0100)] 
Try fixing ``ORMExecuteState`` again.

follow up of 7c3d3670c68298e88d03bc8f02e01c6a3f7fe42f

Change-Id: I3e9b7ab458677efcf47256103543fcc6db2a3076

3 years agoImprove ``ORMExecuteState`` documentation 7363/head
Federico Caselli [Wed, 24 Nov 2021 14:11:04 +0000 (15:11 +0100)] 
Improve ``ORMExecuteState`` documentation

3 years agopropose emulated setinputsizes embedded in the compiler
Mike Bayer [Mon, 22 Nov 2021 19:28:26 +0000 (14:28 -0500)] 
propose emulated setinputsizes embedded in the compiler

Add a new system so that PostgreSQL and other dialects have a
reliable way to add casts to bound parameters in SQL statements,
replacing previous use of setinputsizes() for PG dialects.

rationale:

1. psycopg3 will be using the same SQLAlchemy-side "setinputsizes"
   as asyncpg, so we will be seeing a lot more of this

2. the full rendering that SQLAlchemy's compilation is performing
   is in the engine log as well as error messages.   Without this,
   we introduce three levels of SQL rendering, the compiler, the
   hidden "setinputsizes" in SQLAlchemy, and then whatever the DBAPI
   driver does.  With this new approach, users reporting bugs etc.
   will be less confused that there are as many as two separate
   layers of "hidden rendering"; SQLAlchemy's rendering is again
   fully transparent

3. calling upon a setinputsizes() method for every statement execution
   is expensive.  this way, the work is done behind the caching layer

4. for "fast insertmany()", I also want there to be a fast approach
   towards setinputsizes.  As it was, we were going to be taking
   a SQL INSERT with thousands of bound parameter placeholders and
   running a whole second pass on it to apply typecasts.    this way,
   we will at least be able to build the SQL string once without a huge
   second pass over the whole string

5. psycopg2 can use this same system for its ARRAY casts

6. the general need for PostgreSQL to have lots of type casts
   is now mostly in the base PostgreSQL dialect and works independently
   of a DBAPI being present.   dependence on DBAPI symbols that aren't
   complete / consistent / hashable is removed

I was originally going to try to build this into bind_expression(),
but it was revealed this worked poorly with custom bind_expression()
as well as empty sets.   the current impl also doesn't need to
run a second expression pass over the POSTCOMPILE sections, which
came out better than I originally thought it would.

Change-Id: I363e6d593d059add7bcc6d1f6c3f91dd2e683c0c

3 years agoSupport lightweight compiler column elements w/ slots
Mike Bayer [Mon, 22 Nov 2021 15:59:06 +0000 (10:59 -0500)] 
Support lightweight compiler column elements w/ slots

the _CompileLabel class included ``__slots__`` but these
weren't used as the superclasses included slots.

Create a ``__slots__`` superclass for ``ClauseElement``,
creating a new class of compilable SQL elements that don't
include heavier features like caching, annotations and
cloning, which are meant to be used only in an ad-hoc
compiler fashion.   Create new ``CompilerColumnElement``
from that which serves in column-oriented contexts, but
similarly does not include any expression operator support
as it is intended to be used only to generate a string.

Apply this to both
``_CompileLabel`` as well as PostgreSQL ``_ColonCast``,
which does not actually subclass ``ColumnElement`` as this
class has memoized attributes that aren't worth changing,
and does not include SQL operator capabilities as these
are not needed for these compiler-only objects.

this allows us to more inexpensively add new ad-hoc
labels / casts etc. at compile time, as we will be seeking
to expand out the typecasts that are needed for PostgreSQL
dialects in a subsequent patch.

Change-Id: I52973ae3295cb6e2eb0d7adc816c678a626643ed

3 years agoRemove object in class definition
Federico Caselli [Sun, 21 Nov 2021 19:36:35 +0000 (20:36 +0100)] 
Remove object in class definition

References: #4600
Change-Id: I2a62ddfe00bc562720f0eae700a497495d7a987a

3 years agoprovide space for new 2.0 changes not part of upgrade path
Mike Bayer [Sun, 21 Nov 2021 17:58:11 +0000 (12:58 -0500)] 
provide space for new 2.0 changes not part of upgrade path

As we are going to be adding new improvements such as
variant, cython, psycopg3, more RETURNING support,
fast execution helpers, and probably a lot more, the
2.0 migration doc needs to also still have the "what's new in 2.0?"
thing going on as well.   Organize the document so it has space
to introduce these sections, as well as the existing
1.4->2.0 migration sections.

If the "What's New" document gets large, we will break up this
page into two separate pages, it's already quite large, so
the proposal would be the exising migration doc becomes
a separate special migration document.

Change-Id: I62496b30229806f4a82d1f92b3f4eda53e64df57

3 years agofix year
Mike Bayer [Sun, 21 Nov 2021 16:50:27 +0000 (11:50 -0500)] 
fix year

Change-Id: I56a325fde167501a53b588cc1b69255238ac1dbb

3 years agoMerge "favor setuptools imports over distutils" into main
mike bayer [Fri, 19 Nov 2021 14:30:09 +0000 (14:30 +0000)] 
Merge "favor setuptools imports over distutils" into main

3 years agoMerge "generalize cache_ok to UserDefinedType" into main
mike bayer [Fri, 19 Nov 2021 14:29:57 +0000 (14:29 +0000)] 
Merge "generalize cache_ok to UserDefinedType" into main

3 years agoMerge "disable raiseerr for refresh state loader options" into main
mike bayer [Thu, 18 Nov 2021 20:50:54 +0000 (20:50 +0000)] 
Merge "disable raiseerr for refresh state loader options" into main

3 years agoMerge "use typing.Dict" into main
mike bayer [Thu, 18 Nov 2021 20:49:08 +0000 (20:49 +0000)] 
Merge "use typing.Dict" into main

3 years agoMerge "fully support isolation_level parameter in base dialect" into main
mike bayer [Thu, 18 Nov 2021 18:55:33 +0000 (18:55 +0000)] 
Merge "fully support isolation_level parameter in base dialect" into main

3 years agouse typing.Dict
Mike Bayer [Thu, 18 Nov 2021 18:39:54 +0000 (13:39 -0500)] 
use typing.Dict

newer Pythons seem to accept ``dict[Any, Any]`` which is why
this wasn't noticed.  Revise fix for #7321 made in
I55656e867876677c5c55143449db371344be8600.

Fixes: #7321
Change-Id: Idc22e15d098543e07853f4532cfd1aaae4dd6404

3 years agofully support isolation_level parameter in base dialect
Mike Bayer [Sat, 6 Nov 2021 17:00:43 +0000 (13:00 -0400)] 
fully support isolation_level parameter in base dialect

Generalized the :paramref:`_sa.create_engine.isolation_level` parameter to
the base dialect so that it is no longer dependent on individual dialects
to be present. This parameter sets up the "isolation level" setting to
occur for all new database connections as soon as they are created by the
connection pool, where the value then stays set without being reset on
every checkin.

The :paramref:`_sa.create_engine.isolation_level` parameter is essentially
equivalent in functionality to using the
:paramref:`_engine.Engine.execution_options.isolation_level` parameter via
:meth:`_engine.Engine.execution_options` for an engine-wide setting. The
difference is in that the former setting assigns the isolation level just
once when a connection is created, the latter sets and resets the given
level on each connection checkout.

Fixes: #6342
Change-Id: Id81d6b1c1a94371d901ada728a610696e09e9741

3 years agodisable raiseerr for refresh state loader options
Mike Bayer [Thu, 18 Nov 2021 17:46:25 +0000 (12:46 -0500)] 
disable raiseerr for refresh state loader options

Fixed ORM regression where the new behavior of "eager loaders run on
unexpire" added in :ticket:`1763` would lead to loader option errors being
raised inappropriately for the case where a single :class:`_orm.Query` or
:class:`_sql.Select` were used to load multiple kinds of entities, along
with loader options that apply to just one of those kinds of entity like a
:func:`_orm.joinedload`, and later the objects would be refreshed from
expiration, where the loader options would attempt to be applied to the
mismatched object type and then raise an exception. The check for this
mismatch now bypasses raising an error for this case.

Fixes: #7318
Change-Id: I111e0f3e0fb0447355574cbdcde002f734833490

3 years agoMerge "remove "native decimal" warning" into main
mike bayer [Thu, 18 Nov 2021 16:16:01 +0000 (16:16 +0000)] 
Merge "remove "native decimal" warning" into main

3 years agoMerge "Add new sections regarding schemas and reflection" into main
mike bayer [Thu, 18 Nov 2021 16:14:34 +0000 (16:14 +0000)] 
Merge "Add new sections regarding schemas and reflection" into main

3 years agoMerge "handle dunder names in @declared_attr separately" into main
mike bayer [Thu, 18 Nov 2021 16:13:16 +0000 (16:13 +0000)] 
Merge "handle dunder names in @declared_attr separately" into main

3 years agoMerge "Deprecate create_engine.implicit_returning" into main
mike bayer [Thu, 18 Nov 2021 16:11:35 +0000 (16:11 +0000)] 
Merge "Deprecate create_engine.implicit_returning" into main

3 years agoremove "native decimal" warning
Mike Bayer [Mon, 8 Nov 2021 17:20:23 +0000 (12:20 -0500)] 
remove "native decimal" warning

Removed the warning that emits from the :class:`_types.Numeric` type about
DBAPIs not supporting Decimal values natively. This warning was oriented
towards SQLite, which does not have any real way without additional
extensions or workarounds of handling precision numeric values more than 15
significant digits as it only uses floating point math to represent
numbers. As this is a known and documented limitation in SQLite itself, and
not a quirk of the pysqlite driver, there's no need for SQLAlchemy to warn
for this. The change does not otherwise modify how precision numerics are
handled. Values can continue to be handled as ``Decimal()`` or ``float()``
as configured with the :class:`_types.Numeric`, :class:`_types.Float` , and
related datatypes, just without the ability to maintain precision beyond 15
significant digits when using SQLite, unless alternate representations such
as strings are used.

Fixes: #7299
Change-Id: Ic570f8107177dec3ddbe94c7b43f40057b03276a

3 years agofavor setuptools imports over distutils
Mike Bayer [Mon, 15 Nov 2021 20:06:06 +0000 (15:06 -0500)] 
favor setuptools imports over distutils

Python 3.10 has deprecated "distutils" in favor of explicit use of
"setuptools" in :pep:`632`; SQLAlchemy's setup.py has replaced imports
accordingly. However, since setuptools itself only recently added the
replacement symbols mentioned in pep-632 as of November of 2022 in version
59.0.1, ``setup.py`` still has fallback imports to distutils, as SQLAlchemy
1.4 does not have a hard setuptools versioning requirement at this time.
SQLAlchemy 2.0 is expected to use a full :pep:`517` installation layout
which will indicate appropriate setuptools versioning up front.

Fixes: #7311
Change-Id: I215ef3c3b226a38266f59d181214aea462c4664d

3 years agohandle dunder names in @declared_attr separately
Mike Bayer [Mon, 15 Nov 2021 01:02:10 +0000 (20:02 -0500)] 
handle dunder names in @declared_attr separately

Fixed Mypy crash which would occur when using Mypy plugin against code
which made use of :class:`_orm.declared_attr` methods for non-mapped names
like ``__mapper_args__``, ``__table_args__``, or other dunder names, as the
plugin would try to interpret these as mapped attributes which would then
be later mis-handled. As part of this change, the decorated function is
still converted by the plugin into a generic assignment statement (e.g.
``__mapper_args__: Any``) so that the argument signature can continue to be
annotated in the same way one would for any other ``@classmethod`` without
Mypy complaining about the wrong argument type for a method that isn't
explicitly ``@classmethod``.

Fixes: #7321
Change-Id: I55656e867876677c5c55143449db371344be8600

3 years agoAdd new sections regarding schemas and reflection
jonathan vanasco [Mon, 27 Sep 2021 16:41:24 +0000 (12:41 -0400)] 
Add new sections regarding schemas and reflection

* add a new section to reflection.rst `Schemas and Reflection`.
  * this contains some text from the ticket
* migrate some text from `Specifying the Schema Name` to new section
* migrate some text from PostgreSQL dialect to new section
  * target text is made more generic
  * cross-reference the postgres and new sections to one another, to avoid duplication of docs
* update some docs 'meta' to 'metadata_obj'

Fixes: #4387
Co-authored-by: Mike Bayer <mike_mp@zzzcomputing.com>
Change-Id: I2b08672753fb2575d30ada07ead77587468fdade

3 years agogeneralize cache_ok to UserDefinedType
Mike Bayer [Wed, 17 Nov 2021 20:08:29 +0000 (15:08 -0500)] 
generalize cache_ok to UserDefinedType

Extended the ``cache_ok`` flag and corresponding warning message if this
flag is not defined, a behavior first established for
:class:`.TypeDecorator` as part of :ticket:`6436`, to also take place for
:class:`.UserDefinedType`, by generalizing the flag and associated caching
logic to a new common base for these two types, :class:`.ExternalType`.

The change means any current :class:`.UserDefinedType` will now cause SQL
statement caching to no longer take place for statements which make use of
the datatype, along with a warning being emitted, unless the class defines
the :attr:`.UserDefinedType.cache_ok` flag as True. If the datatype cannot
form a deterministic, hashable cache key derived from its arguments, it may return
False which will continue to keep caching disabled but will suppress the
warning. In particular, custom datatypes currently used in packages such as
SQLAlchemy-utils will need to implement this flag. The issue was observed
as a result of a SQLAlchemy-utils datatype that is not currently cacheable.

Fixes: #7319
Change-Id: Ie0b5d4587df87bfe66d2fe7cd4585c3882584575

3 years agoAdd Non linear CTE support
Eric Masseran [Tue, 2 Nov 2021 20:40:04 +0000 (16:40 -0400)] 
Add Non linear CTE support

"Compound select" methods like :meth:`_sql.Select.union`,
:meth:`_sql.Select.intersect_all` etc. now accept ``*other`` as an argument
rather than ``other`` to allow for multiple additional SELECTs to be
compounded with the parent statement at once. In particular, the change as
applied to :meth:`_sql.CTE.union` and :meth:`_sql.CTE.union_all` now allow
for a so-called "non-linear CTE" to be created with the :class:`_sql.CTE`
construct, whereas previously there was no way to have more than two CTE
sub-elements in a UNION together while still correctly calling upon the CTE
in recursive fashion. Pull request courtesy Eric Masseran.

Allow:

```sql
WITH RECURSIVE nodes(x) AS (
   SELECT 59
   UNION
   SELECT aa FROM edge JOIN nodes ON bb=x
   UNION
   SELECT bb FROM edge JOIN nodes ON aa=x
)
SELECT x FROM nodes;
```

Based on @zzzeek suggestion: https://github.com/sqlalchemy/sqlalchemy/pull/7133#issuecomment-933882348

Fixes: #7259
Closes: #7260
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/7260
Pull-request-sha: 2565a5fd4b1940e92125e53aeaa731cc682f49bb

Change-Id: I685c8379762b5fb6ab4107ff8f4d8a4de70c0ca6

3 years agopass through docs for 2.0 style
Mike Bayer [Thu, 11 Nov 2021 20:59:33 +0000 (15:59 -0500)] 
pass through docs for 2.0 style

this change restores the orm/tutorial.rst and
core/tutorial.rst files, hidden from the index with
an update on the new tutorial.

Also started noting Query is legacy, as we will have
lots of docs to update for 2.0 style.

Change-Id: I4f98eeaaa0fd6e03b9976320b568975fe6d06ade

3 years agocherry-pick changelog update for 1.4.28
Mike Bayer [Thu, 11 Nov 2021 15:48:50 +0000 (10:48 -0500)] 
cherry-pick changelog update for 1.4.28

3 years agocherry-pick changelog from 1.4.27
Mike Bayer [Thu, 11 Nov 2021 15:48:50 +0000 (10:48 -0500)] 
cherry-pick changelog from 1.4.27

3 years agoMerge "removals: all unicode encoding / decoding" into main
mike bayer [Thu, 11 Nov 2021 15:30:43 +0000 (15:30 +0000)] 
Merge "removals: all unicode encoding / decoding" into main

3 years agoremovals: all unicode encoding / decoding
Mike Bayer [Sun, 7 Nov 2021 20:47:15 +0000 (15:47 -0500)] 
removals: all unicode encoding / decoding

Removed here includes:

* convert_unicode parameters
* encoding create_engine() parameter
* description encoding support
* "non-unicode fallback" modes under Python 2
* String symbols regarding Python 2 non-unicode fallbacks
* any concept of DBAPIs that don't accept unicode
  statements, unicode bound parameters, or that return bytes
  for strings anywhere except an explicit Binary / BLOB
  type
* unicode processors in Python / C

Risk factors:

* Whether all DBAPIs do in fact return Unicode objects for
  all entries in cursor.description now
* There was logic for mysql-connector trying to determine
  description encoding.   A quick test shows Unicode coming
  back but it's not clear if there are still edge cases where
  they return bytes.  if so, these are bugs in that driver,
  and at most we would only work around it in the mysql-connector
  DBAPI itself (but we won't do that either).
* It seems like Oracle 8 was not expecting unicode bound parameters.
  I'm assuming this was all Python 2 stuff and does not apply
  for modern cx_Oracle under Python 3.
* third party dialects relying upon built in unicode encoding/decoding
  but it's hard to imagine any non-SQLAlchemy database driver not
  dealing exclusively in Python unicode strings in Python 3

Change-Id: I97d762ef6d4dd836487b714d57d8136d0310f28a
References: #7257

3 years agoqualify asyncpg API tests for python 3.8
Mike Bayer [Wed, 10 Nov 2021 14:52:18 +0000 (09:52 -0500)] 
qualify asyncpg API tests for python 3.8

Getting
TypeError: object MagicMock can't be used in 'await' expression
for Python 3.7 and earlier.  this test is not needed
on all platforms it's confirming that two methods
are present.

Change-Id: If918add023c98c062ea0c1cd132a999647a2d35f

3 years agoMerge "set within_columns_clause=False for all sub-elements of select()" into main
mike bayer [Tue, 9 Nov 2021 23:56:12 +0000 (23:56 +0000)] 
Merge "set within_columns_clause=False for all sub-elements of select()" into main

3 years agoMerge "upgrade deferred loader to regular loader if refresh_state" into main
mike bayer [Tue, 9 Nov 2021 23:55:10 +0000 (23:55 +0000)] 
Merge "upgrade deferred loader to regular loader if refresh_state" into main

3 years agoMerge "change the POSTCOMPILE/ SCHEMA symbols to not conflict w mssql quoting" into...
mike bayer [Tue, 9 Nov 2021 23:52:28 +0000 (23:52 +0000)] 
Merge "change the POSTCOMPILE/ SCHEMA symbols to not conflict w mssql quoting" into main

3 years agoMerge "Fixes: #7295" into main
mike bayer [Tue, 9 Nov 2021 20:35:50 +0000 (20:35 +0000)] 
Merge "Fixes: #7295" into main

3 years agochange the POSTCOMPILE/ SCHEMA symbols to not conflict w mssql quoting
Mike Bayer [Mon, 8 Nov 2021 23:29:16 +0000 (18:29 -0500)] 
change the POSTCOMPILE/ SCHEMA symbols to not conflict w mssql quoting

Adjusted the compiler's generation of "post compile" symbols including
those used for "expanding IN" as well as for the "schema translate map" to
not be based directly on plain bracketed strings with underscores, as this
conflicts directly with SQL Server's quoting format of also using brackets,
which produces false matches when the compiler replaces "post compile" and
"schema translate" symbols. The issue created easy to reproduce examples
both with the :meth:`.Inspector.get_schema_names` method when used in
conjunction with the
:paramref:`_engine.Connection.execution_options.schema_translate_map`
feature, as well in the unlikely case that a symbol overlapping with the
internal name "POSTCOMPILE" would be used with a feature like "expanding
in".

Fixes: #7300
Change-Id: I6255c850b140522a4aba95085216d0bca18ce230

3 years agoset within_columns_clause=False for all sub-elements of select()
Mike Bayer [Tue, 9 Nov 2021 20:02:44 +0000 (15:02 -0500)] 
set within_columns_clause=False for all sub-elements of select()

Fixed issue where using the feature of using a string label for ordering or
grouping described at :ref:`tutorial_order_by_label` would fail to function
correctly if used on a :class:`.CTE` construct, when the CTE were embedded
inside of an enclosing :class:`_sql.Select` statement that itself was set
up as a scalar subquery.

Fixes: #7269
Change-Id: Ied6048a1c9a622374a418230c8cfedafa8d3f87e

3 years agorevert mis-commit from aa026c302c6b188a7e28508f9ecb603809b9e03f
Mike Bayer [Tue, 9 Nov 2021 20:04:22 +0000 (15:04 -0500)] 
revert mis-commit from aa026c302c6b188a7e28508f9ecb603809b9e03f

A scratch line from #7269 was inadvertently committed here.
this needs to be in its own commit w/ tests.

Change-Id: I62796e18b05bbbd3b6225e9f27e1e63ab98cf24c

3 years agoupgrade deferred loader to regular loader if refresh_state
Mike Bayer [Tue, 9 Nov 2021 16:31:23 +0000 (11:31 -0500)] 
upgrade deferred loader to regular loader if refresh_state

Fixed issue where deferred polymorphic loading of attributes from a
joined-table inheritance subclass would fail to populate the attribute
correctly if the :func:`_orm.load_only` option were used to originally
exclude that attribute, in the case where the load_only were descending
from a relationship loader option.  The fix allows that other valid options
such as ``defer(..., raiseload=True)`` etc. still function as expected.

Fixes: #7304
Change-Id: I58b7ce7c450bcc52d2f0c9bfbcb4d747463ee9b2

3 years agoDeprecate create_engine.implicit_returning
jonathan vanasco [Mon, 27 Sep 2021 19:15:33 +0000 (15:15 -0400)] 
Deprecate create_engine.implicit_returning

The :paramref:`_sa.create_engine.implicit_returning` parameter is
deprecated on the :func:`_sa.create_engine` function only; the parameter
remains available on the :class:`_schema.Table` object. This parameter was
originally intended to enable the "implicit returning" feature of
SQLAlchemy when it was first developed and was not enabled by default.
Under modern use, there's no reason this parameter should be disabled, and
it has been observed to cause confusion as it degrades performance and
makes it more difficult for the ORM to retrieve recently inserted server
defaults. The parameter remains available on :class:`_schema.Table` to
specifically suit database-level edge cases which make RETURNING
infeasible, the sole example currently being SQL Server's limitation that
INSERT RETURNING may not be used on a table that has INSERT triggers on it.

Also removed from the Oracle dialect some logic that would upgrade
an Oracle 8/8i server version to use implicit returning if the
parameter were explictly passed; these versions of Oracle
still support RETURNING so the feature is now enabled for all
Oracle versions.

Fixes: #6962
Change-Id: Ib338e300cd7c8026c3083043f645084a8211aed8

3 years agoDe-emphasize notion of "default driver" (DBAPI)
Gord Thompson [Mon, 8 Nov 2021 18:03:54 +0000 (11:03 -0700)] 
De-emphasize notion of "default driver" (DBAPI)

Fixes: #6960
Even though a default driver still exists for
each dialect, remove most usages of `dialect://`
to encourage users to explicitly specify
`dialect+driver://`

Change-Id: I0ad42167582df509138fca64996bbb53e379b1af

3 years agoFixes: #4390
jonathan vanasco [Mon, 27 Sep 2021 16:51:32 +0000 (12:51 -0400)] 
Fixes: #4390
Deprecated an undocumented loader option syntax ``".*"``, which appears to
be no different than passing a single asterisk, and will emit a deprecation
warning if used. This syntax may have been intended for something but there
is currently no need for it.

The original ticket was to document the `.{WILDCARD}` (e.g. `.*`) format,
however this format does not appear to be used or needed by SQLAlchemy
and is likely not used by any projects or developers.

This PR invokes `util.warn_deprecated` to notify users this functionality
is deprecated, and directs them to the #4390 issue if they actually use it.

Assuming there are no complaints over this warning in the coming months,
this code can be removed in a future major release.

Change-Id: I665e3ac26be0a7819246a2ee56fb5a5f32980c91

3 years agoconnection doc updates for future
Mike Bayer [Mon, 8 Nov 2021 15:36:11 +0000 (10:36 -0500)] 
connection doc updates for future

* remove autocommit section, missed in future engine merge
* remove implicit execution section, also missed
* rewrite "transactions" section to fully discuss
  "commit as you go" vs. "begin once", remove all references
  to "future"
* fix up "understanding DBAPI autocommit" to be a little more
  clear

Pushing this straight up, we can attend to remaining typos /
edits ad hoc

Change-Id: I687c89a515e5a5cdce69700b039bb7c10d90159a

3 years agoMerge "fully implement future engine and remove legacy" into main
mike bayer [Sun, 7 Nov 2021 21:19:45 +0000 (21:19 +0000)] 
Merge "fully implement future engine and remove legacy" into main

3 years agofully implement future engine and remove legacy
Mike Bayer [Mon, 1 Nov 2021 19:44:44 +0000 (15:44 -0400)] 
fully implement future engine and remove legacy

The major action here is to lift and move future.Connection
and future.Engine fully into sqlalchemy.engine.base.   This
removes lots of engine concepts, including:

* autocommit
* Connection running without a transaction, autobegin
  is now present in all cases
* most "autorollback" is obsolete
* Core-level subtransactions (i.e. MarkerTransaction)
* "branched" connections, copies of connections
* execution_options() returns self, not a new connection
* old argument formats, distill_params(), simplifies calling
  scheme between engine methods
* before/after_execute() events (oriented towards compiled constructs)
  don't emit for exec_driver_sql().  before/after_cursor_execute()
  is still included for this
* old helper methods superseded by context managers, connection.transaction(),
  engine.transaction() engine.run_callable()
* ancient engine-level reflection methods has_table(), table_names()
* sqlalchemy.testing.engines.proxying_engine

References: #7257

Change-Id: Ib20ed816642d873b84221378a9ec34480e01e82c

3 years agoFixes: #7295
jonathan vanasco [Fri, 5 Nov 2021 16:38:30 +0000 (12:38 -0400)] 
Fixes: #7295
Fixed issue in ``Table``` object where: param:`implicit_returning` was not
compatible with: param:`extend_existing`.
Change-Id: I16f4ab585d82f5691a3fed9eba04b84730a8a59e

3 years agoMerge "use tuple expansion if type._is_tuple, test for Sequence if no type" into...
mike bayer [Fri, 5 Nov 2021 20:34:39 +0000 (20:34 +0000)] 
Merge "use tuple expansion if type._is_tuple, test for Sequence if no type" into main

3 years agouse tuple expansion if type._is_tuple, test for Sequence if no type
Mike Bayer [Fri, 5 Nov 2021 14:18:42 +0000 (10:18 -0400)] 
use tuple expansion if type._is_tuple, test for Sequence if no type

Fixed regression where the row objects returned for ORM queries, which are
now the normal :class:`_sql.Row` objects, would not be interpreted by the
:meth:`_sql.ColumnOperators.in_` operator as tuple values to be broken out
into individual bound parameters, and would instead pass them as single
values to the driver leading to failures. The change to the "expanding IN"
system now accommodates for the expression already being of type
:class:`.TupleType` and treats values accordingly if so. In the uncommon
case of using "tuple-in" with an untyped statement such as a textual
statement with no typing information, a tuple value is detected for values
that implement ``collections.abc.Sequence``, but that are not ``str`` or
``bytes``, as always when testing for ``Sequence``.

Added :class:`.TupleType` to the top level ``sqlalchemy`` import namespace.

Fixes: #7292
Change-Id: I8286387e3b3c3752b3bd4ae3560d4f31172acc22

3 years agofix typo in changelog.
Federico Caselli [Fri, 5 Nov 2021 08:58:18 +0000 (09:58 +0100)] 
fix typo in changelog.

Change-Id: Ic78a9ce9032ab759fc796d3218b64352dde6155b

3 years agoCheck for Mapping explicitly in 2.0 params
Mike Bayer [Thu, 4 Nov 2021 21:02:24 +0000 (17:02 -0400)] 
Check for Mapping explicitly in 2.0 params

Fixed issue in future :class:`_future.Connection` object where the
:meth:`_future.Connection.execute` method would not accept a non-dict
mapping object, such as SQLAlchemy's own :class:`.RowMapping` or other
``abc.collections.Mapping`` object as a parameter dictionary.

Fixes: #7291
Change-Id: I819f079d86d19d1d81c570e0680f987e51e34b84

3 years agoUpdate "transaction has already begun" language
Mike Bayer [Thu, 4 Nov 2021 17:36:43 +0000 (13:36 -0400)] 
Update "transaction has already begun" language

As future connections will now be autobeginning, there
will be more cases where begin() can't be called as well as where isolation level
can't be set, which will be surprising as this is a behavioral
change for 2.0; additionally, when DBAPI autocommit is set,
there isn't actually a DBAPI level transaction in effect even though
Connection has a Transaction object.  Clarify the language in these
two error messages to make it clear that begin() and autobegin
are tracking a SQLAlchemy-level Transaction() object, whether or not
the DBAPI has actually started a transaction, and that this is the
reason rollback() or commit() is required before performing
the requsted operation.   Additionally make sure the error message
mentions "autobegin" as a likely reason this error is being
encountered along with what Connection needs the user to do in
order to resolve.

Change-Id: If8763939eeabc46aa9d9209a56d05ad82b892c5c

3 years agoMerge "simplify and publicize the asyncpg JSON(B) codec registrsation" into main
mike bayer [Thu, 4 Nov 2021 16:27:40 +0000 (16:27 +0000)] 
Merge "simplify and publicize the asyncpg JSON(B) codec registrsation" into main

3 years agosimplify and publicize the asyncpg JSON(B) codec registrsation
Mike Bayer [Wed, 3 Nov 2021 15:32:51 +0000 (11:32 -0400)] 
simplify and publicize the asyncpg JSON(B) codec registrsation

Added overridable methods ``PGDialect_asyncpg.setup_asyncpg_json_codec``
and ``PGDialect_asyncpg.setup_asyncpg_jsonb_codec`` codec, which handle the
required task of registering JSON/JSONB codecs for these datatypes when
using asyncpg. The change is that methods are broken out as individual,
overridable methods to support third party dialects that need to alter or
disable how these particular codecs are set up.

Fixes: #7284
Change-Id: I3eac258fea61f3975bd03c428747f788813ce45e

3 years agouse ExpressionElementRole for case targets in case()
Mike Bayer [Thu, 4 Nov 2021 01:26:44 +0000 (21:26 -0400)] 
use ExpressionElementRole for case targets in case()

Fixed regression where the :func:`_sql.text` construct would no longer be
accepted as a target case in the "whens" list within a :func:`_sql.case`
construct. The regression appears related to an attempt to guard against
some forms of literal values that were considered to be ambiguous when
passed here; however, there's no reason the target cases shouldn't be
interpreted as open-ended SQL expressions just like anywhere else, and a
literal string or tuple will be converted to a bound parameter as would be
the case elsewhere.

Fixes: #7287
Change-Id: I75478adfa115f3292cb1362cc5b2fdf152b0ed6f

3 years agoadd missing info from groupby documentation
Federico Caselli [Wed, 3 Nov 2021 21:47:51 +0000 (22:47 +0100)] 
add missing info from groupby documentation

Change-Id: Icfaf242353c23a579fe79f9d72500a08d90fcb77
Signed-off-by: Federico Caselli <cfederico87@gmail.com>
3 years agoRevert "Gracefully degrade unsupported types with asyncpg"
mike bayer [Wed, 3 Nov 2021 15:13:22 +0000 (15:13 +0000)] 
Revert "Gracefully degrade unsupported types with asyncpg"

This reverts commit 96c294da8a50d692b3f0b8e508dbbca5d9c22f1b.

I have another approach that is more obvious, easier to override explicitly and also I can test it more easily.

Change-Id: I11a3be7700dbc6f25d436e450b6fb8e8f6c4fd16

3 years agoformatting updates
Mike Bayer [Wed, 3 Nov 2021 15:01:08 +0000 (11:01 -0400)] 
formatting updates

Change-Id: I7352bed0115b8fcdb4708e012d83e81d1ae494ed

3 years agoMerge "Gracefully degrade unsupported types with asyncpg" into main
mike bayer [Wed, 3 Nov 2021 14:50:36 +0000 (14:50 +0000)] 
Merge "Gracefully degrade unsupported types with asyncpg" into main

3 years agoMerge "Fixed issue in visit_on_duplicate_key_update within a composed expression...
mike bayer [Wed, 3 Nov 2021 14:49:20 +0000 (14:49 +0000)] 
Merge "Fixed issue in visit_on_duplicate_key_update within a composed expression" into main

3 years agoFixed issue in visit_on_duplicate_key_update within a composed expression
Cristian Sabaila [Wed, 3 Nov 2021 01:39:08 +0000 (21:39 -0400)] 
Fixed issue in visit_on_duplicate_key_update within a composed expression

Fixed issue in MySQL :meth:`_mysql.Insert.on_duplicate_key_update` which
would render the wrong column name when an expression were used in a VALUES
expression. Pull request courtesy Cristian Sabaila.

Fixes: #7281
Closes: #7285
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/7285
Pull-request-sha: 3e6ad6f2fecc6ae36a10a5a34b5d3d393483edbb

Change-Id: I83377c20eae6358fead9e7e361127938e538a71c