diff --git a/databases/backends/aiopg.py b/databases/backends/aiopg.py index 0b4d95a3..1df30699 100644 --- a/databases/backends/aiopg.py +++ b/databases/backends/aiopg.py @@ -5,15 +5,13 @@ import uuid import aiopg +from sqlalchemy.dialects.postgresql.psycopg import PGDialect_psycopg from sqlalchemy.engine.cursor import CursorResultMetaData from sqlalchemy.engine.interfaces import Dialect, ExecutionContext -from sqlalchemy.engine.row import Row from sqlalchemy.sql import ClauseElement from sqlalchemy.sql.ddl import DDLElement from databases.backends.common.records import Record, Row, create_column_maps -from databases.backends.compilers.psycopg import PGCompiler_psycopg -from databases.backends.dialects.psycopg import PGDialect_psycopg from databases.core import LOG_EXTRA, DatabaseURL from databases.interfaces import ( ConnectionBackend, @@ -38,12 +36,10 @@ def _get_dialect(self) -> Dialect: dialect = PGDialect_psycopg( json_serializer=json.dumps, json_deserializer=lambda x: x ) - dialect.statement_compiler = PGCompiler_psycopg dialect.implicit_returning = True dialect.supports_native_enum = True dialect.supports_smallserial = True # 9.2+ dialect._backslash_escapes = False - dialect.supports_sane_multi_rowcount = True # psycopg 2.0.9+ dialect._has_native_hstore = True dialect.supports_native_decimal = True diff --git a/databases/backends/compilers/__init__.py b/databases/backends/compilers/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/databases/backends/compilers/psycopg.py b/databases/backends/compilers/psycopg.py deleted file mode 100644 index 654c22a1..00000000 --- a/databases/backends/compilers/psycopg.py +++ /dev/null @@ -1,17 +0,0 @@ -from sqlalchemy.dialects.postgresql.psycopg import PGCompiler_psycopg - - -class APGCompiler_psycopg2(PGCompiler_psycopg): - def construct_params(self, *args, **kwargs): - pd = super().construct_params(*args, **kwargs) - - for column in self.prefetch: - pd[column.key] = self._exec_default(column.default) - - return pd - - def _exec_default(self, default): - if default.is_callable: - return default.arg(self.dialect) - else: - return default.arg diff --git a/databases/backends/dialects/__init__.py b/databases/backends/dialects/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/databases/backends/dialects/psycopg.py b/databases/backends/dialects/psycopg.py deleted file mode 100644 index 07bd1880..00000000 --- a/databases/backends/dialects/psycopg.py +++ /dev/null @@ -1,46 +0,0 @@ -""" -All the unique changes for the databases package -with the custom Numeric as the deprecated pypostgresql -for backwards compatibility and to make sure the -package can go to SQLAlchemy 2.0+. -""" - -import typing - -from sqlalchemy import types, util -from sqlalchemy.dialects.postgresql.base import PGDialect, PGExecutionContext -from sqlalchemy.engine import processors -from sqlalchemy.types import Float, Numeric - - -class PGExecutionContext_psycopg(PGExecutionContext): - ... - - -class PGNumeric(Numeric): - def bind_processor( - self, dialect: typing.Any - ) -> typing.Union[str, None]: # pragma: no cover - return processors.to_str - - def result_processor( - self, dialect: typing.Any, coltype: typing.Any - ) -> typing.Union[float, None]: # pragma: no cover - if self.asdecimal: - return None - else: - return processors.to_float - - -class PGDialect_psycopg(PGDialect): - colspecs = util.update_copy( - PGDialect.colspecs, - { - types.Numeric: PGNumeric, - types.Float: Float, - }, - ) - execution_ctx_cls = PGExecutionContext_psycopg - - -dialect = PGDialect_psycopg diff --git a/databases/backends/psycopg.py b/databases/backends/psycopg.py index f83f4917..da0a6718 100644 --- a/databases/backends/psycopg.py +++ b/databases/backends/psycopg.py @@ -22,7 +22,7 @@ class PsycopgBackend(DatabaseBackend): _database_url: DatabaseURL _options: typing.Dict[str, typing.Any] _dialect: Dialect - _pool: typing.Optional[psycopg_pool.AsyncConnectionPool] + _pool: typing.Optional[psycopg_pool.AsyncConnectionPool] = None def __init__( self, @@ -33,7 +33,6 @@ def __init__( self._options = options self._dialect = PGDialect_psycopg() self._dialect.implicit_returning = True - self._pool = None async def connect(self) -> None: if self._pool is not None: @@ -95,7 +94,10 @@ async def fetch_all(self, query: ClauseElement) -> typing.List[RecordInterface]: rows = await cursor.fetchall() column_maps = create_column_maps(result_columns) - return [PsycopgRecord(row, result_columns, self._dialect, column_maps) for row in rows] + return [ + PsycopgRecord(row, result_columns, self._dialect, column_maps) + for row in rows + ] async def fetch_one(self, query: ClauseElement) -> typing.Optional[RecordInterface]: if self._connection is None: @@ -167,7 +169,8 @@ def raw_connection(self) -> typing.Any: return self._connection def _compile( - self, query: ClauseElement, + self, + query: ClauseElement, ) -> typing.Tuple[str, typing.Mapping[str, typing.Any], tuple]: compiled = query.compile( dialect=self._dialect, @@ -224,7 +227,9 @@ def _mapping(self) -> typing.Mapping: def __getitem__(self, key: typing.Any) -> typing.Any: if len(self._column_map) == 0: - return self._mapping[key] + if isinstance(key, str): + return self._mapping[key] + return self._row[key] elif isinstance(key, Column): idx, datatype = self._column_map_full[str(key)] elif isinstance(key, int):