From e3716012c535c0aeac2a8cc5a32609ed2d4197c1 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Mon, 7 Sep 2020 16:24:47 -0400 Subject: Create connection characteristics API; implement postgresql flags Added support for PostgreSQL "readonly" and "deferrable" flags for all of psycopg2, asyncpg and pg8000 dialects. This takes advantage of a newly generalized version of the "isolation level" API to support other kinds of session attributes set via execution options that are reliably reset when connections are returned to the connection pool. Fixes: #5549 Change-Id: I0ad6d7a095e49d331618274c40ce75c76afdc7dd --- lib/sqlalchemy/dialects/postgresql/asyncpg.py | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'lib/sqlalchemy/dialects/postgresql/asyncpg.py') diff --git a/lib/sqlalchemy/dialects/postgresql/asyncpg.py b/lib/sqlalchemy/dialects/postgresql/asyncpg.py index 515ef6e28..eb87249b4 100644 --- a/lib/sqlalchemy/dialects/postgresql/asyncpg.py +++ b/lib/sqlalchemy/dialects/postgresql/asyncpg.py @@ -465,6 +465,8 @@ class AsyncAdapt_asyncpg_connection: "dbapi", "_connection", "isolation_level", + "readonly", + "deferrable", "_transaction", "_started", ) @@ -475,6 +477,8 @@ class AsyncAdapt_asyncpg_connection: self.dbapi = dbapi self._connection = connection self.isolation_level = "read_committed" + self.readonly = False + self.deferrable = False self._transaction = None self._started = False self.await_(self._setup_type_codecs()) @@ -530,7 +534,9 @@ class AsyncAdapt_asyncpg_connection: try: self._transaction = self._connection.transaction( - isolation=self.isolation_level + isolation=self.isolation_level, + readonly=self.readonly, + deferrable=self.deferrable, ) await self._transaction.start() except Exception as error: @@ -763,6 +769,18 @@ class PGDialect_asyncpg(PGDialect): connection.set_isolation_level(level) + def set_readonly(self, connection, value): + connection.readonly = value + + def get_readonly(self, connection): + return connection.readonly + + def set_deferrable(self, connection, value): + connection.deferrable = value + + def get_deferrable(self, connection): + return connection.deferrable + def create_connect_args(self, url): opts = url.translate_connect_args(username="user") if "port" in opts: -- cgit v1.2.1