diff options
Diffstat (limited to 'lib/sqlalchemy/engine')
-rw-r--r-- | lib/sqlalchemy/engine/create.py | 6 | ||||
-rw-r--r-- | lib/sqlalchemy/engine/cursor.py | 1 | ||||
-rw-r--r-- | lib/sqlalchemy/engine/default.py | 12 | ||||
-rw-r--r-- | lib/sqlalchemy/engine/interfaces.py | 19 | ||||
-rw-r--r-- | lib/sqlalchemy/engine/url.py | 7 |
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): |