diff options
| author | Tony Locke <tlocke@tlocke.org.uk> | 2020-08-02 15:19:26 -0400 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2020-08-18 11:12:16 -0400 |
| commit | 06f1929b866abc2af0ff5c838e472a8b1c98d6e6 (patch) | |
| tree | 9f71fcea759c2c7a5012486d053355488782bcb8 /lib/sqlalchemy/testing | |
| parent | bd61d19a1c2f5d70131ed09eee69198f75d3ac44 (diff) | |
| download | sqlalchemy-06f1929b866abc2af0ff5c838e472a8b1c98d6e6.tar.gz | |
Update dialect for pg8000 version 1.16.0
The pg8000 dialect has been revised and modernized for the most recent
version of the pg8000 driver for PostgreSQL. Changes to the dialect
include:
* All data types are now sent as text rather than binary.
* Using adapters, custom types can be plugged in to pg8000.
* Previously, named prepared statements were used for all statements.
Now unnamed prepared statements are used by default, and named
prepared statements can be used explicitly by calling the
Connection.prepare() method, which returns a PreparedStatement
object.
Pull request courtesy Tony Locke.
Notes by Mike: to get this all working it was needed to break
up JSONIndexType into "str" and "int" subtypes; this will be
needed for any dialect that is dependent on setinputsizes().
also includes @caselit's idea to include query params
in the dbdriver parameter.
Co-authored-by: Mike Bayer <mike_mp@zzzcomputing.com>
Closes: #5451
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/5451
Pull-request-sha: 639751ca9c7544801b9ede02e6cbe15a16c59c82
Change-Id: I2869bc52c330916773a41d11d12c297aecc8fcd8
Diffstat (limited to 'lib/sqlalchemy/testing')
| -rw-r--r-- | lib/sqlalchemy/testing/assertions.py | 8 | ||||
| -rw-r--r-- | lib/sqlalchemy/testing/provision.py | 22 | ||||
| -rw-r--r-- | lib/sqlalchemy/testing/suite/test_types.py | 32 |
3 files changed, 22 insertions, 40 deletions
diff --git a/lib/sqlalchemy/testing/assertions.py b/lib/sqlalchemy/testing/assertions.py index fe74be823..f9fabbeed 100644 --- a/lib/sqlalchemy/testing/assertions.py +++ b/lib/sqlalchemy/testing/assertions.py @@ -346,12 +346,12 @@ def _expect_raises(except_cls, msg=None, check_context=False): assert success, "Callable did not raise an exception" -def expect_raises(except_cls): - return _expect_raises(except_cls, check_context=True) +def expect_raises(except_cls, check_context=True): + return _expect_raises(except_cls, check_context=check_context) -def expect_raises_message(except_cls, msg): - return _expect_raises(except_cls, msg=msg, check_context=True) +def expect_raises_message(except_cls, msg, check_context=True): + return _expect_raises(except_cls, msg=msg, check_context=check_context) class AssertsCompiledSQL(object): diff --git a/lib/sqlalchemy/testing/provision.py b/lib/sqlalchemy/testing/provision.py index 21bacfca2..094d1ea94 100644 --- a/lib/sqlalchemy/testing/provision.py +++ b/lib/sqlalchemy/testing/provision.py @@ -7,6 +7,7 @@ from . import engines from .. import exc from ..engine import url as sa_url from ..util import compat +from ..util import parse_qsl log = logging.getLogger(__name__) @@ -85,7 +86,7 @@ def generate_db_urls(db_urls, extra_drivers): --dburi postgresql://db1 \ --dburi postgresql://db2 \ --dburi postgresql://db2 \ - --dbdriver=psycopg2 --dbdriver=asyncpg + --dbdriver=psycopg2 --dbdriver=asyncpg?async_fallback=true Noting that the default postgresql driver is psycopg2. the output would be:: @@ -139,21 +140,34 @@ def _generate_driver_urls(url, extra_drivers): main_driver = url.get_driver_name() extra_drivers.discard(main_driver) - url = generate_driver_url(url, main_driver) + url = generate_driver_url(url, main_driver, {}) yield str(url) for drv in list(extra_drivers): - new_url = generate_driver_url(url, drv) + + if "?" in drv: + + driver_only, query_str = drv.split("?", 1) + + query = parse_qsl(query_str) + else: + driver_only = drv + query = {} + + new_url = generate_driver_url(url, driver_only, query) if new_url: extra_drivers.remove(drv) + yield str(new_url) @register.init -def generate_driver_url(url, driver): +def generate_driver_url(url, driver, query): backend = url.get_backend_name() new_url = copy.copy(url) + new_url.query = dict(new_url.query) new_url.drivername = "%s+%s" % (backend, driver) + new_url.query.update(query) try: new_url.get_dialect() except exc.NoSuchModuleError: diff --git a/lib/sqlalchemy/testing/suite/test_types.py b/lib/sqlalchemy/testing/suite/test_types.py index 5e6ac1eab..6a390231b 100644 --- a/lib/sqlalchemy/testing/suite/test_types.py +++ b/lib/sqlalchemy/testing/suite/test_types.py @@ -34,7 +34,6 @@ from ... import testing from ... import Text from ... import Time from ... import TIMESTAMP -from ... import type_coerce from ... import TypeDecorator from ... import Unicode from ... import UnicodeText @@ -1161,37 +1160,6 @@ class JSONStringCastIndexTest(_LiteralRoundTripFixture, fixtures.TablesTest): and_(name == "r6", cast(col["b"], String) == '"some value"'), "r6" ) - def test_crit_against_int_basic(self): - name = self.tables.data_table.c.name - col = self.tables.data_table.c["data"] - - self._test_index_criteria( - and_(name == "r6", cast(col["a"], String) == "5"), "r6" - ) - - def _dont_test_crit_against_string_coerce_type(self): - name = self.tables.data_table.c.name - col = self.tables.data_table.c["data"] - - self._test_index_criteria( - and_( - name == "r6", - cast(col["b"], String) == type_coerce("some value", JSON), - ), - "r6", - test_literal=False, - ) - - def _dont_test_crit_against_int_coerce_type(self): - name = self.tables.data_table.c.name - col = self.tables.data_table.c["data"] - - self._test_index_criteria( - and_(name == "r6", cast(col["a"], String) == type_coerce(5, JSON)), - "r6", - test_literal=False, - ) - __all__ = ( "UnicodeVarcharTest", |
