]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/log
thirdparty/sqlalchemy/sqlalchemy.git
5 years agoimport StringIO => import io 4889/head
Matt Kohl [Fri, 4 Oct 2019 05:56:50 +0000 (06:56 +0100)] 
import StringIO => import io

5 years agoMerge "Change Oracle max_identifier_length to 128"
mike bayer [Thu, 3 Oct 2019 21:42:48 +0000 (21:42 +0000)] 
Merge "Change Oracle max_identifier_length to 128"

5 years agoMerge "call setinputsizes for cx_Oracle.DATETIME"
mike bayer [Thu, 3 Oct 2019 21:41:40 +0000 (21:41 +0000)] 
Merge "call setinputsizes for cx_Oracle.DATETIME"

5 years agoMerge "Apply quoting to SQL Server _switch_db"
mike bayer [Thu, 3 Oct 2019 21:40:27 +0000 (21:40 +0000)] 
Merge "Apply quoting to SQL Server _switch_db"

5 years agocall setinputsizes for cx_Oracle.DATETIME
Mike Bayer [Thu, 3 Oct 2019 18:09:54 +0000 (14:09 -0400)] 
call setinputsizes for cx_Oracle.DATETIME

Restored adding cx_Oracle.DATETIME to the setinputsizes() call when a
SQLAlchemy :class:`.Date`, :class:`.DateTime` or :class:`.Time` datatype is
used, so that in the case where a bound parameter is passed as NULL
in some complex queries (in particular this happens with some lazy load
situations), the type is still present.  This was removed
in the 1.2 series for arbitrary reasons.

Also adds a suite test for this generic situation.

What's not clear is that do we really need setinputsizes() for all
datatypes if we are supporting NULL in bound parameters.

Fixes: #4886
Change-Id: If99215c31861f9ea6f60a30d47f2f320adc4797f

5 years agoApply quoting to SQL Server _switch_db
Mike Bayer [Thu, 3 Oct 2019 15:18:06 +0000 (11:18 -0400)] 
Apply quoting to SQL Server _switch_db

Added identifier quoting to the schema name applied to the "use" statement
which is invoked when a SQL Server multipart schema name is used within  a
:class:`.Table` that is being reflected, as well as for :class:`.Inspector`
methods such as :meth:`.Inspector.get_table_names`; this accommodates for
special characters or spaces in the database name.  Additionally, the "use"
statement is not emitted if the current database matches the target owner
database name being passed.

Fixes: #4883
Change-Id: I84419730e94aac3a88d331ad8c24d10aabbc34af

5 years agoChange Oracle max_identifier_length to 128
Mike Bayer [Wed, 2 Oct 2019 19:37:24 +0000 (15:37 -0400)] 
Change Oracle max_identifier_length to 128

The max_identifier_length for the Oracle dialect is now 128 characters by
default, unless compatibility version less than 12.2 upon first connect, in
which case the legacy length of 30 characters is used.  This is a
continuation of the issue as committed to the 1.3 series which adds max
identifier length detection upon first connect as well as warns for the
change in Oracle server.

Fixes: #4857
Change-Id: I5b11edaebb54ec7f0e5456a785105838a1d752e5

5 years agoMerge "remove __init__ from MySQLDialect_pyodbc"
mike bayer [Wed, 2 Oct 2019 21:57:43 +0000 (21:57 +0000)] 
Merge "remove __init__ from MySQLDialect_pyodbc"

5 years ago- additional edits to README.dialects.rst
Mike Bayer [Wed, 2 Oct 2019 21:41:53 +0000 (17:41 -0400)] 
- additional edits to README.dialects.rst

Change-Id: I06add0ca77d038f03941ba266cb69dbd6a246ee8

5 years agoMerge remote-tracking branch 'origin/pr/4870'
Mike Bayer [Wed, 2 Oct 2019 21:42:35 +0000 (17:42 -0400)] 
Merge remote-tracking branch 'origin/pr/4870'

Change-Id: I6815063af600681316a4f3cf1cde93866b93db98

5 years agoremove __init__ from MySQLDialect_pyodbc
Gord Thompson [Wed, 2 Oct 2019 20:06:53 +0000 (16:06 -0400)] 
remove __init__ from MySQLDialect_pyodbc

Fixes: #4869
<!-- Provide a general summary of your proposed changes in the Title field above -->

### Description
remove __init__ from MySQLDialect_pyodbc, specifically to get rid of the convert_unicode flag

### Checklist
<!-- go over following points. check them with an `x` if they do apply, (they turn into clickable checkboxes once the PR is submitted, so no need to do everything at once)

-->

This pull request is:

- [ ] A documentation / typographical error fix
- Good to go, no issue or tests are needed
- [x] A short code fix
- please include the issue number, and create an issue if none exists, which
  must include a complete example of the issue.  one line code fixes without an
  issue and demonstration will not be accepted.
- Please include: `Fixes: #<issue number>` in the commit message
- please include tests.   one line code fixes without tests will not be accepted.
- [ ] A new feature implementation
- please include the issue number, and create an issue if none exists, which must
  include a complete example of how the feature would look.
- Please include: `Fixes: #<issue number>` in the commit message
- please include tests.

**Have a nice day!**

Closes: #4884
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/4884
Pull-request-sha: d63550aca4ff9321e094fcb02105ecfa9d1076e1

Change-Id: I8986f7bf6de4d2b221106eded63576439d467c0f

5 years agoAdd max_identifier_length parameter; warn for Oracle
Mike Bayer [Wed, 2 Oct 2019 15:20:58 +0000 (11:20 -0400)] 
Add max_identifier_length parameter; warn for Oracle

Added new :func:`.create_engine` parameter
:paramref:`.create_engine.max_identifier_length`. This overrides the
dialect-coded "max identifier length" in order to accommodate for databases
that have recently changed this length and the SQLAlchemy dialect has
not yet been adjusted to detect for that version.  This parameter interacts
with the existing :paramref:`.create_engine.label_length` parameter in that
it establishes the maximum (and default) value for anonymously generated
labels.

The Oracle dialect now emits a warning if Oracle version 12.2 or greater is
used, and the :paramref:`.create_engine.max_identifier_length` parameter is
not set.   The version in this specific case defaults to that of the
"compatibility" version set in the Oracle server configuration, not the
actual server version.   In version 1.4, the default max_identifier_length
for 12.2 or greater will move to 128 characters.  In order to maintain
forwards compatibility, applications should set
:paramref:`.create_engine.max_identifier_length` to 30 in order to maintain
the same length behavior, or to 128 in order to test the upcoming behavior.
This length determines among other things how generated constraint names
are truncated for statements like ``CREATE CONSTRAINT`` and ``DROP
CONSTRAINT``, which means a the new length may produce a name-mismatch
against a name that was generated with the old length, impacting database
migrations.

Fixes: #4857
Change-Id: Ib62efb00c6180c375869029b57353d90385d7950

5 years agoMerge "Run row value processors up front"
mike bayer [Tue, 1 Oct 2019 21:00:35 +0000 (21:00 +0000)] 
Merge "Run row value processors up front"

5 years agoRun row value processors up front
Mike Bayer [Tue, 4 Jun 2019 21:29:20 +0000 (17:29 -0400)] 
Run row value processors up front

as part of a larger series of changes to generalize row-tuples,
RowProxy becomes plain Row and is no longer a "proxy"; the
DBAPI row is now copied directly into the Row when constructed,
result handling occurs at once.

Subsequent changes will break out Row into a new version that
behaves fully a tuple.

Change-Id: I2ffa156afce5d21c38f28e54c3a531f361345dd5

5 years agoCancel polymorphic loading in optimized get
Mike Bayer [Tue, 1 Oct 2019 01:26:08 +0000 (21:26 -0400)] 
Cancel polymorphic loading in optimized get

Since optimized_get for inheriting mappers writes a simple
SELECT, we need to cancel out any with_polymorphic selectables
that interfere with simple column lookup.  While adaptation is
another option, just removing the with_polymorphic is much
simpler.   The issue is not noticeable unless the ResultProxy
is not allowing "key fallback" column lookups, which will
be the case when this behavior is deprecated.

Fixes: #4718
Change-Id: I8fa2f5c0434b6a681813a92ac71fe12712f5d634

5 years ago- Add changelog for #4873
Mike Bayer [Mon, 30 Sep 2019 17:10:38 +0000 (13:10 -0400)] 
- Add changelog for #4873

Change-Id: I882d3c0e2b7e10cb5a2bec2d45d088ad51da1831

5 years agoMerge "Simplify _ColumnEntity, related"
mike bayer [Mon, 30 Sep 2019 15:32:18 +0000 (15:32 +0000)] 
Merge "Simplify _ColumnEntity, related"

5 years agoSimplify _ColumnEntity, related
Mike Bayer [Fri, 27 Sep 2019 21:32:10 +0000 (17:32 -0400)] 
Simplify _ColumnEntity, related

In the interests of making Query much more lightweight up front,
rework the calculations done at the top when the entities
are constructed to be much less inolved.  Use the new
coercion system for _ColumnEntity and stop accepting
plain strings, this will need to emit a deprecation warning
in 1.3.x.     Use annotations and other techniques to reduce
the decisionmaking and complexity of Query.

For the use case of subquery(), .statement, etc. we would like
to do minimal work in order to get the columns clause.

Change-Id: I7e459bbd3bb10ec71235f75ef4f3b0a969bec590

5 years agoEnsure states with null m2o FK value are still populated by selectinloader
Mike Bayer [Mon, 30 Sep 2019 13:55:40 +0000 (09:55 -0400)] 
Ensure states with null m2o FK value are still populated by selectinloader

Fixed regression in selectinload loader strategy caused by #4775 (released
in version 1.3.6) where a many-to-one attribute of None would no longer be
populated by the loader.  While this was usually not noticeable due to the
lazyloader populating None upon get, it would lead to a detached instance
error if the object were detached.

Fixes: #4872
Change-Id: I18466841683111643810ebc4331376df38c4767b

5 years agoupdate README.dialects; add *.pyd to .gitignore 4870/head
Gord Thompson [Sun, 29 Sep 2019 18:36:01 +0000 (12:36 -0600)] 
update README.dialects; add *.pyd to .gitignore

5 years agoMove identity_lookup to session
Mike Bayer [Thu, 26 Sep 2019 22:07:46 +0000 (18:07 -0400)] 
Move identity_lookup to session

This performance critical method is on Query needlessly, just to appease
the horizontal sharding API.   Have the performance impact of invoking
Query only incur if horizontal sharding is actually used.

Change-Id: I03db2befe2f5614380258927a62ed389a6ba0fae

5 years agoUnify generation between Core and ORM query
Mike Bayer [Wed, 25 Sep 2019 21:42:51 +0000 (17:42 -0400)] 
Unify generation between Core and ORM query

generation is to be enhanced to include caching
functionality, so ensure that Query and all generative in Core
(e.g. select, DML etc) are using the same generations system.

Additionally, deprecate Select.append methods and state
Select methods independently of their append versions.
Mutability of expression objects is a special case only when
generating new objects during a visit.

Fixes: #4637
Change-Id: I3dfac00d5e0f710c833b236f7a0913e1ca24dde4

5 years agomove pytest assert rewrite to conftest.py
Mike Bayer [Mon, 23 Sep 2019 20:33:04 +0000 (16:33 -0400)] 
move pytest assert rewrite to conftest.py

this seems to be the best place to put this as it is guaranteed
before the module is imported.   this is for the benefit of
3rd party dialects that also would have this in their conftest.py,
so that they don't have to do the "bootstrap" loading hack.

Change-Id: Ieae5324240e04a7919df46f4fca03f8db7a2af81

5 years agoSupport SQLite URIs
Mike Bayer [Fri, 20 Sep 2019 13:25:40 +0000 (09:25 -0400)] 
Support SQLite URIs

Added support for sqlite "URI" connections, which allow for sqlite-specific
flags to be passed in the query string such as "read only" for Python
sqlite3 drivers that support this.

Fixes: #4863
Change-Id: I7740b55ee8f2ede72a5c49ee94a7540e4d0250f2

5 years agoAdd req for nullable booleans
Mike Bayer [Wed, 18 Sep 2019 13:56:33 +0000 (09:56 -0400)] 
Add req for nullable booleans

Access doesn't allow for Yes/No columns to store null, so add
a rule for this.

Change-Id: If9316cd05733e39fbd59a6f54024f6740b563041

5 years agoAdd missing suite_level requirements "independent_connections"
Mike Bayer [Wed, 18 Sep 2019 12:47:46 +0000 (08:47 -0400)] 
Add missing suite_level requirements "independent_connections"

In 14b1e6fe8e18d139846c1aba6761d4eea3dc25c3 we added
suite-level requirements but did not add them to the
base, causing failures in third party dialect test suites.

Change-Id: I7edf0be86b814b508071c5c752fc2dd744a3d9ad

5 years agoFix typo in docs (errors.rst) 4862/head
Mikhail Burshteyn [Wed, 18 Sep 2019 11:00:26 +0000 (14:00 +0300)] 
Fix typo in docs (errors.rst)

5 years agoAdd missing suite level requirements from 2efd89d02941
Mike Bayer [Wed, 18 Sep 2019 01:04:21 +0000 (21:04 -0400)] 
Add missing suite level requirements from 2efd89d02941

In 2efd89d02941ab4267d6e2842963fd38b1539f6c we added
suite-level requirements but did not add them to the
base, causing failures in third party dialect test suites.

Change-Id: Ic5f1a053f5c47166e1b12c613595823106c8736e

5 years agoAdd missing suite level requirements from #4234
Mike Bayer [Tue, 17 Sep 2019 16:49:46 +0000 (12:49 -0400)] 
Add missing suite level requirements from #4234

In 9d5e117f6fcc38d8773bc943c615888dc8a3a819 we added
suite-level requirements but did not add them to the
base, causing failures in third party dialect test suites.

Change-Id: I030b5d0fd957814dfce77a71b59babd9b5e3b1bc
References: #4234

5 years agoAdd note on the use of tuple_() for the IN operator in the docs
Stepland [Mon, 16 Sep 2019 15:40:29 +0000 (11:40 -0400)] 
Add note on the use of tuple_() for the IN operator in the docs

Closes: #4861
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/4861
Pull-request-sha: c7379d390752d0c10d6488872b163b06ee30d952

Change-Id: I223008f720fe64951e2a0bf95aab955ece22516b

5 years agoDocument visitors module
Mike Bayer [Thu, 12 Sep 2019 16:37:38 +0000 (12:37 -0400)] 
Document visitors module

As we are going to be adding a lot of new features to the visitors
module which may impact end-user custom constructs, start documenting
the package for now.

Change-Id: Ibae471c2cb861f6280f601b7b2382d61968825cd

5 years agoMerge "Restore subquery.as_scalar() w/ deprecation"
mike bayer [Wed, 11 Sep 2019 15:10:16 +0000 (15:10 +0000)] 
Merge "Restore subquery.as_scalar() w/ deprecation"

5 years agoRestore subquery.as_scalar() w/ deprecation
Mike Bayer [Tue, 10 Sep 2019 16:46:21 +0000 (12:46 -0400)] 
Restore subquery.as_scalar() w/ deprecation

Apparently Alias had an .as_scalar() method, so restore an
equivalent to Subquery with an appropriate deprecation warning.

Fixes: #4854
Change-Id: I6255d61b7d82487ca90ba8ee79d4b3a74e7cbe38

5 years agoRemove unnecessary util.callable usage
Steven Loria [Mon, 9 Sep 2019 14:48:29 +0000 (10:48 -0400)] 
Remove unnecessary util.callable usage

Fixes: #4850
<!-- Provide a general summary of your proposed changes in the Title field above -->

### Description
<!-- Describe your changes in detail -->

Removes usage of `util.callable`.

### Checklist
<!-- go over following points. check them with an `x` if they do apply, (they turn into clickable checkboxes once the PR is submitted, so no need to do everything at once)

-->

This pull request is:

- [ ] A documentation / typographical error fix
- Good to go, no issue or tests are needed
- [x] A short code fix
- please include the issue number, and create an issue if none exists, which
  must include a complete example of the issue.  one line code fixes without an
  issue and demonstration will not be accepted.
- Please include: `Fixes: #<issue number>` in the commit message
- please include tests.   one line code fixes without tests will not be accepted.
- [ ] A new feature implementation
- please include the issue number, and create an issue if none exists, which must
  include a complete example of how the feature would look.
- Please include: `Fixes: #<issue number>` in the commit message
- please include tests.

**Have a nice day!**

Closes: #4851
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/4851
Pull-request-sha: a0ccdff2cb74f5e944d8baccc269c382b591c8e2

Change-Id: I79918f44becbc5dbefdc7ff65128695c1cabed1d

5 years agoUse compat.raise_from_cause() for re-raise of schema item error
Mike Bayer [Sun, 8 Sep 2019 01:34:14 +0000 (21:34 -0400)] 
Use compat.raise_from_cause() for re-raise of schema item error

Fixes: #4847
Change-Id: I5bc8a87ccae1b49ea507d344b7933c248e04ee89

5 years agoCatch set_parent_w_dispatch missing
Mike Bayer [Fri, 6 Sep 2019 22:40:46 +0000 (18:40 -0400)] 
Catch set_parent_w_dispatch missing

Added an explicit error message for the case when objects passed to
:class:`.Table` are not :class:`.SchemaItem` objects, rather than resolving
to an attribute error.

Fixes: #4847
Change-Id: I4dcdcee86b64c85ccf12e2ddc3d638563d307991

5 years agoAdjustments to _copy_internals()
Mike Bayer [Fri, 6 Sep 2019 16:45:53 +0000 (12:45 -0400)] 
Adjustments to _copy_internals()

We are looking to build a generalization of copy_internals(),
so move out any special logic from these methods.   Re-implement
and clarify rationale for the Alias doesnt copy a TableClause rule as
part of the adaption
traversal, establish that we forgot to build out comparison and cache
key for CTE, remove incomplete _copy_internals() from GenerativeSelect
(it doesn't handle the order_by_clause or group_by_clause, so is incomplete)

Change-Id: I95039f042503171aade4ba0fabc9b1598e3c49cf

5 years agoMerge remote-tracking branch 'origin/pr/4842'
Mike Bayer [Fri, 6 Sep 2019 00:12:21 +0000 (20:12 -0400)] 
Merge remote-tracking branch 'origin/pr/4842'

Change-Id: I4f8463e76b27dd58e047b9099f6089ffbe661e17

5 years agoadd SQL Server 2017 to mssql/base.py - Fixes #4833
Gord Thompson [Fri, 6 Sep 2019 00:10:08 +0000 (20:10 -0400)] 
add SQL Server 2017 to mssql/base.py - Fixes #4833

### Description
Add version 14 for SQL Server 2017 to mssql/base.py

Fixes #4833

### Checklist
<!-- go over following points. check them with an `x` if they do apply, (they turn into clickable checkboxes once the PR is submitted, so no need to do everything at once)

-->

This pull request is:

- [ ] A documentation / typographical error fix
- Good to go, no issue or tests are needed
- [x] A short code fix
- please include the issue number, and create an issue if none exists, which
  must include a complete example of the issue.  one line code fixes without an
  issue and demonstration will not be accepted.
- Please include: `Fixes: #<issue number>` in the commit message
- please include tests.   one line code fixes without tests will not be accepted.
- [ ] A new feature implementation
- please include the issue number, and create an issue if none exists, which must
  include a complete example of how the feature would look.
- Please include: `Fixes: #<issue number>` in the commit message
- please include tests.

Closes: #4832
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/4832
Pull-request-sha: 3d72335284fd585c40b961bbc7013e53f3874cb5

Change-Id: Ib53a938a22386aab9e603048753cd2966c5d2b33

5 years agoMerge "Improve testcase condition statement for dialects"
mike bayer [Fri, 6 Sep 2019 00:09:37 +0000 (00:09 +0000)] 
Merge "Improve testcase condition statement for dialects"

5 years agoMerge "Strip special chars in anonymized bind names"
mike bayer [Thu, 5 Sep 2019 15:52:21 +0000 (15:52 +0000)] 
Merge "Strip special chars in anonymized bind names"

5 years agoImprove testcase condition statement for dialects
j00356287 [Thu, 5 Sep 2019 15:50:13 +0000 (11:50 -0400)] 
Improve testcase condition statement for dialects

We could get dialect.requires_name_normalize rather than use hard code
as "firebird" or "oracle", since we have add `normalize` attribute for
quite a long time.

### Description

Use `dialect.requires_name_normalize` instead `testing.against("firebird", "oracle")`

### Checklist
<!-- go over following points. check them with an `x` if they do apply, (they turn into clickable checkboxes once the PR is submitted, so no need to do everything at once)

-->

This pull request is:

- [ ] A documentation / typographical error fix
- Good to go, no issue or tests are needed
- [x] A short code fix
- please include the issue number, and create an issue if none exists, which
  must include a complete example of the issue.  one line code fixes without an
  issue and demonstration will not be accepted.
- Please include: `Fixes: #<issue number>` in the commit message
- please include tests.   one line code fixes without tests will not be accepted.
- [ ] A new feature implementation
- please include the issue number, and create an issue if none exists, which must
  include a complete example of how the feature would look.
- Please include: `Fixes: #<issue number>` in the commit message
- please include tests.

**Have a nice day!**

Closes: #4843
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/4843
Pull-request-sha: 304fe67b06c1f010a164806a12b68cfce9bd0d2b

Change-Id: I276f781482779473258f9269074847e283711b05

5 years agoDocument Query deduplication
Mike Bayer [Thu, 5 Sep 2019 15:46:44 +0000 (11:46 -0400)] 
Document Query deduplication

Users are frequently confused why count() does not return the same
number as the number of objects returned by all().  While we continue
to want to find a better solution to this problem, in the meantime
this has never been clearly documented.  Add an FAQ section with
links from .count() , .all(), ORM tutorial.

Change-Id: I6eff36b686ff6cdd55489036fc48a981bc47d5ee

5 years agoUpdate link to sqlalchemy-access 4842/head
Gord Thompson [Thu, 5 Sep 2019 13:53:41 +0000 (07:53 -0600)] 
Update link to sqlalchemy-access

5 years agoStrip special chars in anonymized bind names
Mike Bayer [Wed, 4 Sep 2019 22:46:53 +0000 (18:46 -0400)] 
Strip special chars in anonymized bind names

Characters that interfere with "pyformat" or "named" formats in bound
parameters, namely ``%, (, )`` and the space character, as well as a few
other typically undesirable characters, are stripped early for a
:func:`.bindparam` that is using an anonymized name, which is typically
generated automatically from a named column which itself includes these
characters in its name and does not use a ``.key``, so that they do not
interfere either with the SQLAlchemy compiler's use of string formatting or
with the driver-level parsing of the parameter, both of which could be
demonstrated before the fix.  The change only applies to anonymized
parameter names that are generated and consumed internally, not end-user
defined names, so the change should have no impact on any existing code.
Applies in particular to the psycopg2 driver which does not otherwise quote
special parameter names, but also strips leading underscores to suit Oracle
(but not yet leading numbers, as some anon parameters are currently
entirely numeric/underscore based); Oracle in any case continues to quote
parameter names that include special characters.

Fixes: #4837
Change-Id: I21cb654c3e4ef786114160b8b4295242720bf3f9

5 years agoRaise for NULL discriminator and pk is present
Mike Bayer [Tue, 3 Sep 2019 13:56:41 +0000 (09:56 -0400)] 
Raise for NULL discriminator and pk is present

An exception is now raised if the ORM loads a row for a polymorphic
instance that has a primary key but the discriminator column is NULL, as
discriminator columns should not be null.

Fixes: #4836
Change-Id: Ice1a853a7dd7687c58079b9933f145b90d314236

5 years agoCreate SECURITY.md
mike bayer [Fri, 30 Aug 2019 23:56:43 +0000 (19:56 -0400)] 
Create SECURITY.md

add SECURITY.md to suit Githubs "security" sidebar.

5 years agoMerge "Annotate session-bind-lookup entity in Query-produced selectables"
mike bayer [Fri, 30 Aug 2019 22:23:44 +0000 (22:23 +0000)] 
Merge "Annotate session-bind-lookup entity in Query-produced selectables"

5 years agoMerge "Render LIMIT/OFFSET conditions after compile on select dialects"
mike bayer [Fri, 30 Aug 2019 22:22:28 +0000 (22:22 +0000)] 
Merge "Render LIMIT/OFFSET conditions after compile on select dialects"

5 years agoAnnotate session-bind-lookup entity in Query-produced selectables
Mike Bayer [Thu, 29 Aug 2019 16:09:17 +0000 (12:09 -0400)] 
Annotate session-bind-lookup entity in Query-produced selectables

Added new entity-targeting capabilities to the :class:`.Query` object to
help with the case where the :class:`.Session` is using a bind dictionary
against mapped classes, rather than a single bind, and the :class:`.Query`
is against a Core statement that was ultimately generated from a method
such as :meth:`.Query.subquery`; a deep search is performed to locate
any ORM entity related to the query in order to locate a mapper if
one is not otherwise present.

Fixes: #4829
Change-Id: I95cf325a5aba21baec4b313246c6f4d692284820

5 years agoRender LIMIT/OFFSET conditions after compile on select dialects
Mike Bayer [Sun, 18 Aug 2019 14:02:24 +0000 (10:02 -0400)] 
Render LIMIT/OFFSET conditions after compile on select dialects

Added new "post compile parameters" feature.  This feature allows a
:func:`.bindparam` construct to have its value rendered into the SQL string
before being passed to the DBAPI driver, but after the compilation step,
using the "literal render" feature of the compiler.  The immediate
rationale for this feature is to support LIMIT/OFFSET schemes that don't
work or perform well as bound parameters handled by the database driver,
while still allowing for SQLAlchemy SQL constructs to be cacheable in their
compiled form.     The immediate targets for the new feature are the "TOP
N" clause used by SQL Server (and Sybase) which does not support a bound
parameter, as well as the "ROWNUM" and optional "FIRST_ROWS()" schemes used
by the Oracle dialect, the former of which has been known to perform better
without bound parameters and the latter of which does not support a bound
parameter.   The feature builds upon the mechanisms first developed to
support "expanding" parameters for IN expressions.   As part of this
feature, the Oracle ``use_binds_for_limits`` feature is turned on
unconditionally and this flag is now deprecated.

- adds limited support for "unique" bound parameters within
a text() construct.

- adds an additional int() check within the literal render
function of the Integer datatype and tests that non-int values
raise ValueError.

Fixes: #4808
Change-Id: Iace97d544d1a7351ee07db970c6bc06a19c712c6

5 years agoDon't create enum constraints in enum sortable tests
Mike Bayer [Fri, 30 Aug 2019 17:11:05 +0000 (13:11 -0400)] 
Don't create enum constraints in enum sortable tests

Fixed unit test regression released in 1.3.8 that would cause failure for
Oracle, SQL Server and other non-native ENUM platforms due to new
enumeration tests added as part of :ticket:`4285` enum sortability in the
unit of work; the enumerations created constraints that were duplicated on
name.

Fixes: #4285
Change-Id: I34f51e82be9b6bb43b0df8c54bb36822e6eeb73e

5 years agoMerge "Label simple column transformations as the column name"
mike bayer [Fri, 30 Aug 2019 15:21:08 +0000 (15:21 +0000)] 
Merge "Label simple column transformations as the column name"

5 years agoLabel simple column transformations as the column name
Mike Bayer [Tue, 27 Aug 2019 21:08:11 +0000 (17:08 -0400)] 
Label simple column transformations as the column name

Additional logic has been added such that certain SQL expressions which
typically wrap a single database column will use the name of that column as
their "anonymous label" name within a SELECT statement, potentially making
key-based lookups in result tuples more intutive.   The primary example of
this is that of a CAST expression, e.g. ``CAST(table.colname AS INTEGER)``,
which will export its default name as "colname", rather than the usual
"anon_1" label, that is, ``CAST(table.colname AS INTEGER) AS colname``.
If the inner expression doesn't have a name, then the previous "anonymous
label" logic is used.  When using SELECT statements that make use of
:meth:`.Select.apply_labels`, such as those emitted by the ORM, the
labeling logic will produce ``<tablename>_<inner column name>`` in the same
was as if the column were named alone.   The logic applies right now to the
:func:`.cast` and :func:`.type_coerce` constructs as well as some
single-element boolean expressions.

Fixes: #4449
Change-Id: Ie3b73470e3bea53f2386cd86514cdc556491564e

5 years agocherry-pick changelog update for 1.3.9
Mike Bayer [Tue, 27 Aug 2019 23:30:04 +0000 (19:30 -0400)] 
cherry-pick changelog update for 1.3.9

5 years agocherry-pick changelog from 1.3.8
Mike Bayer [Tue, 27 Aug 2019 23:30:04 +0000 (19:30 -0400)] 
cherry-pick changelog from 1.3.8

5 years agoMerge "Implement type-level sorting for Enum; apply to ORM primary keys"
mike bayer [Tue, 27 Aug 2019 19:29:21 +0000 (19:29 +0000)] 
Merge "Implement type-level sorting for Enum; apply to ORM primary keys"

5 years agoImplement type-level sorting for Enum; apply to ORM primary keys
Nicolas CANIART [Thu, 22 Aug 2019 18:16:29 +0000 (14:16 -0400)] 
Implement type-level sorting for Enum; apply to ORM primary keys

Added support for the use of an :class:`.Enum` datatype using Python
pep-435 enumeration objects as values for use as a primary key column
mapped by the ORM.  As these values are not inherently sortable, as
required by the ORM for primary keys, a new
:attr:`.TypeEngine.sort_key_function` attribute is added to the typing
system which allows any SQL type to  implement a sorting for Python objects
of its type which is consulted by the unit of work.   The :class:`.Enum`
type then defines this using the  database value of a given enumeration.
The sorting scheme can be  also be redefined by passing a callable to the
:paramref:`.Enum.sort_key_function` parameter.  Pull request courtesy
Nicolas Caniart.

Fixes: #4285
Closes: #4816
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/4816
Pull-request-sha: 42266b766c1e462d5b8a409cda05d33dea13bd34

Change-Id: Iadcc16173c1ba26ffac5830db57743a4cb987c55

5 years agoPGDialect.get_check_constraints: Handle "NOT VALID"
Bill Finn [Tue, 27 Aug 2019 16:21:57 +0000 (12:21 -0400)] 
PGDialect.get_check_constraints: Handle "NOT VALID"

Added support for reflection of CHECK constraints that include the special
PostgreSQL qualifier "NOT VALID", which can be present for CHECK
constraints that were added to an exsiting table with the directive that
they not be applied to existing data in the table. The PostgreSQL
dictionary for CHECK constraints as returned by
:meth:`.Inspector.get_check_constraints` may include an additional entry
``dialect_options`` which within will contain an entry ``"not_valid":
True`` if this symbol is detected.   Pull request courtesy Bill Finn.

Fixes: #4824
Closes: #4825
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/4825
Pull-request-sha: a0e1ab133c2d46521a74e55423ac2ba866682dae

Change-Id: I78365f50055c95474c92124b85df66c5c80c00c8

5 years agoMerge "Serialize the context dictionary in Load objects"
mike bayer [Mon, 26 Aug 2019 20:50:56 +0000 (20:50 +0000)] 
Merge "Serialize the context dictionary in Load objects"

5 years agoSerialize the context dictionary in Load objects
Mike Bayer [Mon, 26 Aug 2019 15:44:09 +0000 (11:44 -0400)] 
Serialize the context dictionary in Load objects

Fixed bug where :class:`.Load` objects were not pickleable due to
mapper/relationship state in the internal context dictionary.  These
objects are now converted to picklable using similar techniques as that of
other elements within the loader option system that have long been
serializable.

Fixes: #4823
Change-Id: Id2a0d8b640ac475c86d6416ad540671e66d410e5

5 years agoMerge "Remove erroneous assertion from array._bind_param"
mike bayer [Mon, 26 Aug 2019 17:40:14 +0000 (17:40 +0000)] 
Merge "Remove erroneous assertion from array._bind_param"

5 years agoRemove erroneous assertion from array._bind_param
Mike Bayer [Mon, 26 Aug 2019 13:45:06 +0000 (09:45 -0400)] 
Remove erroneous assertion from array._bind_param

Fixed bug where Postgresql operators such as
:meth:`.postgresql.ARRAY.Comparator.contains` and
:meth:`.postgresql.ARRAY.Comparator.contained_by` would fail to function
correctly for non-integer values when used against a
:class:`.postgresql.array` object, due to an erroneous assert statement.

Fixes: #4822
Change-Id: I886aca4c86dc7d64e9d0dfc1d910a0ae64d775a1

5 years agoRun eager loaders on unexpire
Mike Bayer [Wed, 26 Apr 2017 22:50:05 +0000 (18:50 -0400)] 
Run eager loaders on unexpire

Eager loaders, such as joined loading, SELECT IN loading, etc., when
configured on a mapper or via query options will now be invoked during
the refresh on an expired object; in the case of selectinload and
subqueryload, since the additional load is for a single object only,
the "immediateload" scheme is used in these cases which resembles the
single-parent query emitted by lazy loading.

Change-Id: I7ca2c77bff58dc21015d60093a88c387937376b2
Fixes: #1763
5 years agobump variance on test_merge_load
Mike Bayer [Fri, 23 Aug 2019 14:55:33 +0000 (10:55 -0400)] 
bump variance on test_merge_load

This test is very sensitive and fluctuates a lot, failing builds,
bump the variance to try and resolve.

Change-Id: Ia19bb8871b432059cb3917ca0050a68f75c0a0f2

5 years agoMerge "Add hide_parameters flag to create_engine"
mike bayer [Thu, 22 Aug 2019 22:02:48 +0000 (22:02 +0000)] 
Merge "Add hide_parameters flag to create_engine"

5 years agoMerge "Ensure discarded collection removed from empty collections"
mike bayer [Thu, 22 Aug 2019 22:01:38 +0000 (22:01 +0000)] 
Merge "Ensure discarded collection removed from empty collections"

5 years agoEnsure discarded collection removed from empty collections
Mike Bayer [Thu, 22 Aug 2019 00:19:43 +0000 (20:19 -0400)] 
Ensure discarded collection removed from empty collections

A bulk replace operation was not attending to the previous
list still present in the "_empty_collections" dictionary
which was added as part of #4519.

Fixes: #4519
Change-Id: I3f99f8647c0fb8140b3dfb03686a5d3b90da633f

5 years agoRemove mock dependency
Mike Bayer [Thu, 22 Aug 2019 18:11:18 +0000 (14:11 -0400)] 
Remove mock dependency

Mock is not needed over python 3.3, we need this tox
requirement only for Python 2.7 right now.

Change-Id: I06ae31f9fe6eaece0ec508e9431e4f8166a59684

5 years agoAdd hide_parameters flag to create_engine
Mike Bayer [Wed, 21 Aug 2019 21:29:55 +0000 (17:29 -0400)] 
Add hide_parameters flag to create_engine

Added new parameter :paramref:`.create_engine.hide_parameters` which when
set to True will cause SQL parameters to no longer be logged, nor rendered
in the string representation of a :class:`.StatementError` object.

Fixes: #4815
Change-Id: Ib87f868b6936cf6b42b192644e9d732ec24266c2

5 years agoFix rst typo
Mike Bayer [Wed, 21 Aug 2019 20:55:32 +0000 (16:55 -0400)] 
Fix rst typo

The changelog for #4793 has a typo in the RST and didn't show up
in the changelog, causing confusion as seen in #4814

Change-Id: I5833097c1576120fbc2ea27c54bbca685ae89f88
References: #4793
References: #4814

5 years agoDocument how to work with reflection and custom datatypes
Mike Bayer [Tue, 20 Aug 2019 13:42:36 +0000 (09:42 -0400)] 
Document how to work with reflection and custom datatypes

Describe the link between table reflection, datatype lookups,
and what approaches are needed in the case where in-Python datatypes
are needed in the reflected table metadata.

Fixes: #4812
Change-Id: I68bef2bf472811797d4f5d9a625c6b9bca902f78

5 years agoMerge "Reflect PK of referred table if referred columns not present"
mike bayer [Mon, 19 Aug 2019 04:41:28 +0000 (04:41 +0000)] 
Merge "Reflect PK of referred table if referred columns not present"

5 years agoMerge "Revise psycopg2 execute_values approach"
mike bayer [Sun, 18 Aug 2019 20:36:48 +0000 (20:36 +0000)] 
Merge "Revise psycopg2 execute_values approach"

5 years agoReflect PK of referred table if referred columns not present
Mike Bayer [Sun, 18 Aug 2019 17:03:49 +0000 (13:03 -0400)] 
Reflect PK of referred table if referred columns not present

Fixed bug where a FOREIGN KEY that was set up to refer to the parent table
by table name only without the column names would not correctly be
reflected as far as setting up the "referred columns", since SQLite's
PRAGMA does not report on these columns if they weren't given explicitly.
For some reason this was harcoded to assume the name of the local column,
which might work for some cases but is not correct. The new approach
reflects the primary key of the referred table and uses the constraint
columns list as the referred columns list, if the remote column(s) aren't
present in the reflected pragma directly.

Fixes: #4810
Change-Id: I7789f83d68845ae197a782080af8ec64a7bf48cc

5 years agoRevise psycopg2 execute_values approach
Mike Bayer [Sat, 17 Aug 2019 02:38:51 +0000 (22:38 -0400)] 
Revise psycopg2 execute_values approach

Revised the approach for the just added support for the psycopg2
"execute_values()" feature added in 1.3.7 for :ticket:`4623`.  The approach
relied upon a regular expression that would fail to match for a more
complex INSERT statement such as one which had subqueries involved.   The
new approach matches exactly the string that was rendered as the VALUES
clause.

Fixes: #4623
Change-Id: Icaae0f7b6bcf87a2cf5c6290a839c8429dd5fac3

5 years agoAdd new "exec_once_unless_exception" system; apply to dialect.initialize
Mike Bayer [Fri, 16 Aug 2019 22:07:06 +0000 (18:07 -0400)] 
Add new "exec_once_unless_exception" system; apply to dialect.initialize

Fixed an issue whereby if the dialect "initialize" process which occurs on
first connect would encounter an unexpected exception, the initialize
process would fail to complete and then no longer attempt on subsequent
connection attempts, leaving the dialect in an un-initialized, or partially
initialized state, within the scope of parameters that need to be
established based on inspection of a live connection.   The "invoke once"
logic in the event system has been reworked to accommodate for this
occurrence using new, private API features that establish an "exec once"
hook that will continue to allow the initializer to fire off on subsequent
connections, until it completes without raising an exception. This does not
impact the behavior of the existing ``once=True`` flag within the event
system.

Fixes: #4807
Change-Id: Iec32999b61b6af4b38b6719e0c2651454619078c

5 years agocherry-pick changelog update for 1.3.8
Mike Bayer [Wed, 14 Aug 2019 17:54:28 +0000 (13:54 -0400)] 
cherry-pick changelog update for 1.3.8

5 years agocherry-pick changelog from 1.3.7
Mike Bayer [Wed, 14 Aug 2019 17:54:27 +0000 (13:54 -0400)] 
cherry-pick changelog from 1.3.7

5 years agoTurn on backend for new tests added for #4803
Mike Bayer [Wed, 14 Aug 2019 14:34:38 +0000 (10:34 -0400)] 
Turn on backend for new tests added for #4803

New tests added are failing on SQL Server which doesn't support
expressions in LIMIT, need better gerrit coverage

Fixes: #4803
Change-Id: I56bc44474d448a1faa1dfccff0b55763329e712d

5 years agoMerge "Add new executemany_mode, support for psycopg2.extras.execute_values()"
mike bayer [Wed, 14 Aug 2019 02:57:46 +0000 (02:57 +0000)] 
Merge "Add new executemany_mode, support for psycopg2.extras.execute_values()"

5 years agoAdd support for try_cast function on sqlalchemy.dialects.mssql
Leonel Atencio [Fri, 9 Aug 2019 21:16:13 +0000 (17:16 -0400)] 
Add support for try_cast  function on sqlalchemy.dialects.mssql

Added new :func:`.mssql.try_cast` construct for SQL Server which emits
"TRY_CAST" syntax.  Pull request courtesy Leonel Atencio.

Fixes: #4782
Closes: #4785
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/4785
Pull-request-sha: cf13303a9d1c0cc0233a82a5d2ca01f438b6fb9b

Change-Id: I74a71ff5e587353f67472534aabe0d54ae8039ae

5 years ago- remove explicit doc for unique_connection as this has been removed
Mike Bayer [Mon, 12 Aug 2019 20:53:15 +0000 (16:53 -0400)] 
- remove explicit doc for unique_connection as this has been removed

Change-Id: I2febfd5fbe1e466adaff1e741652e3d1be78ecea

5 years agoAdd new executemany_mode, support for psycopg2.extras.execute_values()
Yuval Dinari [Mon, 12 Aug 2019 14:44:59 +0000 (10:44 -0400)] 
Add new executemany_mode, support for psycopg2.extras.execute_values()

Added new dialect flag for the psycopg2 dialect, ``executemany_mode`` which
supersedes the previous experimental ``use_batch_mode`` flag.
``executemany_mode`` supports both the "execute batch" and "execute values"
functions provided by psycopg2, the latter which is used for compiled
:func:`.insert` constructs.   Pull request courtesy Yuval Dinari.

.. seealso::

    :ref:`executemany_mode`

Fixes: #4623
Closes: #4764
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/4764
Pull-request-sha: c3d3a36f7eb66c86d14ed9c1c31b4b48bd204855

Change-Id: I77e26ca729f9317af1488a6c054c23fa1a6b622b

5 years agoMerge "Use compat.string_types to check for visit name string"
mike bayer [Mon, 12 Aug 2019 14:42:52 +0000 (14:42 +0000)] 
Merge "Use compat.string_types to check for visit name string"

5 years agoMerge "Rewrite pool reset_on_return parsing using a util function"
mike bayer [Mon, 12 Aug 2019 14:42:25 +0000 (14:42 +0000)] 
Merge "Rewrite pool reset_on_return parsing using a util function"

5 years agoRewrite pool reset_on_return parsing using a util function
Mike Bayer [Sun, 11 Aug 2019 19:24:13 +0000 (15:24 -0400)] 
Rewrite pool reset_on_return parsing using a util function

Choosing a util.symbol() based on a user parameter is about to have
another use case added as part of #4623, so add a generalized solution
ahead of it.

Change-Id: I420631f81af2ffc655995b9cce9ff2ac618c16d7

5 years agoUse compat.string_types to check for visit name string
Mike Bayer [Mon, 12 Aug 2019 00:44:42 +0000 (20:44 -0400)] 
Use compat.string_types to check for visit name string

Th visitor optimization looking for plain string needs to
accommodate for u"" in Python 2 due to the unicode_literals
future.

Fixes: #4800
Change-Id: I5e3136f2f2cbd5f24d89186b599f59ea2e7f1550

5 years agoUse ternary when running conditional with Query._offset
Mike Bayer [Sun, 11 Aug 2019 14:54:49 +0000 (10:54 -0400)] 
Use ternary when running conditional with Query._offset

Fixed bug where using :meth:`.Query.first` or a slice expression in
conjunction with a query that has an expression based "offset" applied
would raise TypeError, due to an "or" conditional against "offset" that did
not expect it to be a SQL expression as opposed to an integer or None.

Fixes: #4803
Change-Id: I56b97a5d23cb45427a27a90ab557fa1ac5c6739e

5 years agoEmit SET NAMES for all MySQL connections w charset
Mike Bayer [Sun, 11 Aug 2019 21:42:59 +0000 (17:42 -0400)] 
Emit SET NAMES for all MySQL connections w charset

The MySQL dialects will emit "SET NAMES" at the start of a connection when
charset is given to the MySQL driver, to appease an apparent behavior
observed in MySQL 8.0 that raises a collation error when a UNION includes
string columns unioned against columns of the form CAST(NULL AS CHAR(..)),
which is what SQLAlchemy's polymorphic_union function does.   The issue
seems to have affected PyMySQL for at least a year, however has recently
appeared as of mysqlclient 1.4.4 based on changes in how this DBAPI creates
a connection.  As the presence of this directive impacts three separate
MySQL charset settings which each have intricate effects based on their
presense,  SQLAlchemy will now emit the directive on new connections to
ensure correct behavior.

Fixes: #4804
Change-Id: If9d7ee00d0ccaf773972b564fe455e8e9edf6627

5 years ago- shore up TypeDecorator docs a bit to not render tons of
Mike Bayer [Sun, 11 Aug 2019 02:20:31 +0000 (22:20 -0400)] 
- shore up TypeDecorator docs a bit to not render tons of
comparator methods

Change-Id: I8f434b18b2bd632a0db0db1376262944272d2198

5 years agoClarify INSERT/UPDATE defaults vs. data marshalling
Mike Bayer [Sat, 10 Aug 2019 22:17:59 +0000 (18:17 -0400)] 
Clarify INSERT/UPDATE defaults vs. data marshalling

- Add a full introductory paragraph to INSERT/UPDATE defaults
stating what we mean when we talk about this concept.  Add a note
differentiating what a default does, vs. a rule that intercepts
data as it moves into the database, providing links

- Add a quick section referring to TypeDecorator in the ORM
section on modifying attribute behavior

- Add an "ORM tip", a new thing that we can use in Core to link
to ORM concepts when useful, in the TypeDecorator section which
mentions that for more open ended conversion of arbitrary user
data based on business rules, @validates might be useful
(although this still does not suit the case of full blown form
validation).

- add glossary entries for DML, data marshalling since we already
use these terms and I'd like to refer to them more often.

Fixes: #4796
Change-Id: Ic4cd5c1595fd51c00a9bf24c021d2e56d457d346

5 years agoCorrect name for json_serializer / json_deserializer, document and test
Mike Bayer [Fri, 9 Aug 2019 03:34:20 +0000 (23:34 -0400)] 
Correct name for json_serializer / json_deserializer, document and test

The dialects that support json are supposed to take arguments
``json_serializer`` and ``json_deserializer`` at the create_engine() level,
however the SQLite dialect calls them ``_json_serilizer`` and
``_json_deserilalizer``.  The names have been corrected, the old names are
accepted with a change warning, and these parameters are now documented as
:paramref:`.create_engine.json_serializer` and
:paramref:`.create_engine.json_deserializer`.

Fixes: #4798
Change-Id: I1dbfe439b421fe9bb7ff3594ef455af8156f8851

5 years agoImplement checkfirst for Index.create(), Index.drop()
Mike Bayer [Tue, 6 Aug 2019 20:10:09 +0000 (16:10 -0400)] 
Implement checkfirst for Index.create(), Index.drop()

The :meth:`.Index.create` and :meth:`.Index.drop` methods now have a
parameter :paramref:`.Index.create.checkfirst`, in the same way as that of
:class:`.Table` and :class:`.Sequence`, which when enabled will cause the
operation to detect if the index exists (or not) before performing a create
or drop operation.

Fixes: #527
Change-Id: Idf994bc016359d0ae86cc64ccb20378115cb66d6

5 years agoMerge "Modernize internal reflection"
mike bayer [Wed, 7 Aug 2019 03:09:30 +0000 (03:09 +0000)] 
Merge "Modernize internal reflection"

5 years agoModernize internal reflection
Mike Bayer [Fri, 2 Aug 2019 16:34:16 +0000 (12:34 -0400)] 
Modernize internal reflection

- Deprecated remaining engine-level introspection and utility methods
including :meth:`.Engine.run_callable`, :meth:`.Engine.transaction`,
:meth:`.Engine.table_names`, :meth:`.Engine.has_table`.   The utility
methods are superseded by modern context-manager patterns, and the table
introspection tasks are suited by the :class:`.Inspector` object.

- The internal dialect method ``Dialect.reflecttable`` has been removed.  A
review of third party dialects has not found any making use of this method,
as it was already documented as one that should not be used by external
dialects.  Additionally, the private ``Engine._run_visitor`` method
is also removed.

- The long-deprecated ``Inspector.get_table_names.order_by`` parameter has
been removed.

- The :paramref:`.Table.autoload_with` parameter now accepts an :class:`.Inspector` object
directly, as well as any :class:`.Engine` or :class:`.Connection` as was the case before.

Fixes: #4755
Change-Id: Iec3a8b0f3e298ba87d532b16fac1e1132f464e21

5 years agoRemove threadlocal strategy docs, remaining contextual_connect
Mike Bayer [Mon, 5 Aug 2019 17:43:06 +0000 (13:43 -0400)] 
Remove threadlocal strategy docs, remaining contextual_connect

in dfb20f07d8, we merged the removal of the threadlocal strategy
from the 1.4 branch.   We forgot to take the docs out :).

Also, there seems to be an uncovered _contextual_connect call
in horizontal shard.  Cover that and repair.

Fixes: #4632
Closes: #4795
Change-Id: Id05cbbebe34a8f547c9c84369a929a2926c7d093

5 years agoMerge branch 'master--changelog13-typo' of https://github.com/nphilipp/sqlalchemy...
Mike Bayer [Mon, 5 Aug 2019 14:22:58 +0000 (10:22 -0400)] 
Merge branch 'master--changelog13-typo' of https://github.com/nphilipp/sqlalchemy into nphilipp-master--changelog13-typo

Change-Id: I5708624686ec752468038364cb2bdb5b1080c98c

5 years agoMerge "Strong reference listen function wrapped by "once""
mike bayer [Mon, 5 Aug 2019 02:51:40 +0000 (02:51 +0000)] 
Merge "Strong reference listen function wrapped by "once""

5 years agoStrong reference listen function wrapped by "once"
Mike Bayer [Sat, 3 Aug 2019 03:20:06 +0000 (23:20 -0400)] 
Strong reference listen function wrapped by "once"

Fixed issue in event system where using the ``once=True`` flag with
dynamically generated listener functions would cause event registration of
future events to fail if those listener functions were garbage collected
after they were used, due to an assumption that a listened function is
strongly referenced.  The "once" wrapped is now modified to strongly
reference the inner function persistently, and documentation is updated
that using "once" does not imply automatic de-registration of listener
functions.

Fixes: #4794
Change-Id: I06388083d1633dcc89e8919eb1e51270f966df38