summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/engine
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sqlalchemy/engine')
-rw-r--r--lib/sqlalchemy/engine/create.py6
-rw-r--r--lib/sqlalchemy/engine/cursor.py1
-rw-r--r--lib/sqlalchemy/engine/default.py12
-rw-r--r--lib/sqlalchemy/engine/interfaces.py19
-rw-r--r--lib/sqlalchemy/engine/url.py7
5 files changed, 42 insertions, 3 deletions
diff --git a/lib/sqlalchemy/engine/create.py b/lib/sqlalchemy/engine/create.py
index f9a65a0f8..8fcba7503 100644
--- a/lib/sqlalchemy/engine/create.py
+++ b/lib/sqlalchemy/engine/create.py
@@ -458,7 +458,11 @@ def create_engine(url, **kwargs):
u, plugins, kwargs = u._instantiate_plugins(kwargs)
entrypoint = u._get_entrypoint()
- dialect_cls = entrypoint.get_dialect_cls(u)
+ _is_async = kwargs.pop("_is_async", False)
+ if _is_async:
+ dialect_cls = entrypoint.get_async_dialect_cls(u)
+ else:
+ dialect_cls = entrypoint.get_dialect_cls(u)
if kwargs.pop("_coerce_config", False):
diff --git a/lib/sqlalchemy/engine/cursor.py b/lib/sqlalchemy/engine/cursor.py
index 1f1a2fcf1..7f2b8b412 100644
--- a/lib/sqlalchemy/engine/cursor.py
+++ b/lib/sqlalchemy/engine/cursor.py
@@ -1223,6 +1223,7 @@ class BaseCursorResult:
"""
+
if (not hard and self._soft_closed) or (hard and self.closed):
return
diff --git a/lib/sqlalchemy/engine/default.py b/lib/sqlalchemy/engine/default.py
index cb04eb525..64500b41b 100644
--- a/lib/sqlalchemy/engine/default.py
+++ b/lib/sqlalchemy/engine/default.py
@@ -1284,6 +1284,7 @@ class DefaultExecutionContext(interfaces.ExecutionContext):
result.out_parameters = out_parameters
def _setup_dml_or_text_result(self):
+
if self.isinsert:
if self.compiled.postfetch_lastrowid:
self.inserted_primary_key_rows = (
@@ -1332,8 +1333,17 @@ class DefaultExecutionContext(interfaces.ExecutionContext):
# assert not result.returns_rows
elif self.isupdate and self._is_implicit_returning:
+ # get rowcount
+ # (which requires open cursor on some drivers)
+ # we were not doing this in 1.4, however
+ # test_rowcount -> test_update_rowcount_return_defaults
+ # is testing this, and psycopg will no longer return
+ # rowcount after cursor is closed.
+ result.rowcount
+
row = result.fetchone()
self.returned_default_rows = [row]
+
result._soft_close()
# test that it has a cursor metadata that is accurate.
@@ -1410,6 +1420,8 @@ class DefaultExecutionContext(interfaces.ExecutionContext):
dialect = self.dialect
+ # all of the rest of this... cython?
+
if dialect._has_events:
inputsizes = dict(inputsizes)
dialect.dispatch.do_setinputsizes(
diff --git a/lib/sqlalchemy/engine/interfaces.py b/lib/sqlalchemy/engine/interfaces.py
index 251d01c5e..faaf073ab 100644
--- a/lib/sqlalchemy/engine/interfaces.py
+++ b/lib/sqlalchemy/engine/interfaces.py
@@ -1114,6 +1114,25 @@ class Dialect:
return cls
@classmethod
+ def get_async_dialect_cls(cls, url):
+ """Given a URL, return the :class:`.Dialect` that will be used by
+ an async engine.
+
+ By default this is an alias of :meth:`.Dialect.get_dialect_cls` and
+ just returns the cls. It may be used if a dialect provides
+ both a sync and async version under the same name, like the
+ ``psycopg`` driver.
+
+ .. versionadded:: 2
+
+ .. seealso::
+
+ :meth:`.Dialect.get_dialect_cls`
+
+ """
+ return cls.get_dialect_cls(url)
+
+ @classmethod
def load_provisioning(cls):
"""set up the provision.py module for this dialect.
diff --git a/lib/sqlalchemy/engine/url.py b/lib/sqlalchemy/engine/url.py
index c83753bdc..7cdf25c21 100644
--- a/lib/sqlalchemy/engine/url.py
+++ b/lib/sqlalchemy/engine/url.py
@@ -655,13 +655,16 @@ class URL(
else:
return cls
- def get_dialect(self):
+ def get_dialect(self, _is_async=False):
"""Return the SQLAlchemy :class:`_engine.Dialect` class corresponding
to this URL's driver name.
"""
entrypoint = self._get_entrypoint()
- dialect_cls = entrypoint.get_dialect_cls(self)
+ if _is_async:
+ dialect_cls = entrypoint.get_async_dialect_cls(self)
+ else:
+ dialect_cls = entrypoint.get_dialect_cls(self)
return dialect_cls
def translate_connect_args(self, names=None, **kw):