summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sqlalchemy')
-rw-r--r--lib/sqlalchemy/dialects/sqlite/pysqlcipher.py5
-rw-r--r--lib/sqlalchemy/engine/base.py3
-rw-r--r--lib/sqlalchemy/sql/selectable.py4
-rw-r--r--lib/sqlalchemy/util/__init__.py1
-rw-r--r--lib/sqlalchemy/util/_concurrency_py3k.py7
-rw-r--r--lib/sqlalchemy/util/concurrency.py4
6 files changed, 20 insertions, 4 deletions
diff --git a/lib/sqlalchemy/dialects/sqlite/pysqlcipher.py b/lib/sqlalchemy/dialects/sqlite/pysqlcipher.py
index 1a9337671..aafc00844 100644
--- a/lib/sqlalchemy/dialects/sqlite/pysqlcipher.py
+++ b/lib/sqlalchemy/dialects/sqlite/pysqlcipher.py
@@ -68,6 +68,11 @@ new connection. Currently, ``cipher``, ``kdf_iter``
e = create_engine('sqlite+pysqlcipher://:testing@/foo.db?cipher=aes-256-cfb&kdf_iter=64000')
+.. warning:: Previous versions of sqlalchemy did not take into consideration
+ the encryption-related pragmas passed in the url string, that were silently
+ ignored. This may cause errors when opening files saved by a
+ previous sqlalchemy version if the encryption options do not match.
+
Pooling Behavior
----------------
diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py
index 663482b1f..64f638a50 100644
--- a/lib/sqlalchemy/engine/base.py
+++ b/lib/sqlalchemy/engine/base.py
@@ -1877,7 +1877,7 @@ class Connection(Connectable):
):
exc_info = sys.exc_info()
- is_exit_exception = not isinstance(e, Exception)
+ is_exit_exception = util.is_exit_exception(e)
if not self._is_disconnect:
self._is_disconnect = (
@@ -2325,7 +2325,6 @@ class Transaction(TransactionalContext):
phase transactions may be used.
"""
-
try:
self._do_commit()
finally:
diff --git a/lib/sqlalchemy/sql/selectable.py b/lib/sqlalchemy/sql/selectable.py
index e24585fa0..1610191d1 100644
--- a/lib/sqlalchemy/sql/selectable.py
+++ b/lib/sqlalchemy/sql/selectable.py
@@ -1115,7 +1115,9 @@ class Join(roles.DMLTableRole, FromClause):
def is_derived_from(self, fromclause):
return (
- fromclause is self
+ # use hash() to ensure direct comparison to annotated works
+ # as well
+ hash(fromclause) == hash(self)
or self.left.is_derived_from(fromclause)
or self.right.is_derived_from(fromclause)
)
diff --git a/lib/sqlalchemy/util/__init__.py b/lib/sqlalchemy/util/__init__.py
index 89d09f930..db3966849 100644
--- a/lib/sqlalchemy/util/__init__.py
+++ b/lib/sqlalchemy/util/__init__.py
@@ -101,6 +101,7 @@ from .concurrency import asyncio
from .concurrency import await_fallback
from .concurrency import await_only
from .concurrency import greenlet_spawn
+from .concurrency import is_exit_exception
from .deprecations import deprecated
from .deprecations import deprecated_20
from .deprecations import deprecated_20_cls
diff --git a/lib/sqlalchemy/util/_concurrency_py3k.py b/lib/sqlalchemy/util/_concurrency_py3k.py
index 3b60e6584..88294557d 100644
--- a/lib/sqlalchemy/util/_concurrency_py3k.py
+++ b/lib/sqlalchemy/util/_concurrency_py3k.py
@@ -10,7 +10,6 @@ from . import compat
from .langhelpers import memoized_property
from .. import exc
-
if compat.py37:
try:
from contextvars import copy_context as _copy_context
@@ -25,6 +24,12 @@ else:
_copy_context = None
+def is_exit_exception(e):
+ return not isinstance(e, Exception) or isinstance(
+ e, (asyncio.TimeoutError, asyncio.CancelledError)
+ )
+
+
# implementation based on snaury gist at
# https://gist.github.com/snaury/202bf4f22c41ca34e56297bae5f33fef
# Issue for context: https://github.com/python-greenlet/greenlet/issues/173
diff --git a/lib/sqlalchemy/util/concurrency.py b/lib/sqlalchemy/util/concurrency.py
index 60db9cfff..463547319 100644
--- a/lib/sqlalchemy/util/concurrency.py
+++ b/lib/sqlalchemy/util/concurrency.py
@@ -12,6 +12,7 @@ if compat.py3k:
from ._concurrency_py3k import await_only
from ._concurrency_py3k import await_fallback
from ._concurrency_py3k import greenlet_spawn
+ from ._concurrency_py3k import is_exit_exception
from ._concurrency_py3k import AsyncAdaptedLock
from ._concurrency_py3k import _util_async_run # noqa F401
from ._concurrency_py3k import (
@@ -36,6 +37,9 @@ if not have_greenlet:
"the greenlet library is required to use this function."
)
+ def is_exit_exception(e): # noqa F811
+ return not isinstance(e, Exception)
+
def await_only(thing): # noqa F811
_not_implemented()