From af1b91626f63e00e11d07ad378d23198abc7f91f Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Sat, 6 Nov 2021 13:00:43 -0400 Subject: fully support isolation_level parameter in base dialect Generalized the :paramref:`_sa.create_engine.isolation_level` parameter to the base dialect so that it is no longer dependent on individual dialects to be present. This parameter sets up the "isolation level" setting to occur for all new database connections as soon as they are created by the connection pool, where the value then stays set without being reset on every checkin. The :paramref:`_sa.create_engine.isolation_level` parameter is essentially equivalent in functionality to using the :paramref:`_engine.Engine.execution_options.isolation_level` parameter via :meth:`_engine.Engine.execution_options` for an engine-wide setting. The difference is in that the former setting assigns the isolation level just once when a connection is created, the latter sets and resets the given level on each connection checkout. Fixes: #6342 Change-Id: Id81d6b1c1a94371d901ada728a610696e09e9741 --- lib/sqlalchemy/dialects/sqlite/base.py | 33 +++++------------------------- lib/sqlalchemy/dialects/sqlite/pysqlite.py | 9 -------- 2 files changed, 5 insertions(+), 37 deletions(-) (limited to 'lib/sqlalchemy/dialects/sqlite') diff --git a/lib/sqlalchemy/dialects/sqlite/base.py b/lib/sqlalchemy/dialects/sqlite/base.py index dc8425859..6c22c8ef3 100644 --- a/lib/sqlalchemy/dialects/sqlite/base.py +++ b/lib/sqlalchemy/dialects/sqlite/base.py @@ -1815,7 +1815,6 @@ class SQLiteDialect(default.DefaultDialect): preparer = SQLiteIdentifierPreparer ischema_names = ischema_names colspecs = colspecs - isolation_level = None construct_arguments = [ ( @@ -1856,7 +1855,6 @@ class SQLiteDialect(default.DefaultDialect): ) def __init__( self, - isolation_level=None, native_datetime=False, json_serializer=None, json_deserializer=None, @@ -1865,7 +1863,6 @@ class SQLiteDialect(default.DefaultDialect): **kwargs ): default.DefaultDialect.__init__(self, **kwargs) - self.isolation_level = isolation_level if _json_serializer: json_serializer = _json_serializer @@ -1918,22 +1915,12 @@ class SQLiteDialect(default.DefaultDialect): {"READ UNCOMMITTED": 1, "SERIALIZABLE": 0} ) + def get_isolation_level_values(self, dbapi_conn): + return list(self._isolation_lookup) + def set_isolation_level(self, connection, level): - try: - isolation_level = self._isolation_lookup[level.replace("_", " ")] - except KeyError as err: - util.raise_( - exc.ArgumentError( - "Invalid value '%s' for isolation_level. " - "Valid isolation levels for %s are %s" - % ( - level, - self.name, - ", ".join(self._isolation_lookup), - ) - ), - replace_context=err, - ) + isolation_level = self._isolation_lookup[level] + cursor = connection.cursor() cursor.execute("PRAGMA read_uncommitted = %d" % isolation_level) cursor.close() @@ -1960,16 +1947,6 @@ class SQLiteDialect(default.DefaultDialect): else: assert False, "Unknown isolation level %s" % value - def on_connect(self): - if self.isolation_level is not None: - - def connect(conn): - self.set_isolation_level(conn, self.isolation_level) - - return connect - else: - return None - @reflection.cache def get_schema_names(self, connection, **kw): s = "PRAGMA database_list" diff --git a/lib/sqlalchemy/dialects/sqlite/pysqlite.py b/lib/sqlalchemy/dialects/sqlite/pysqlite.py index 10912e0d5..45a35be65 100644 --- a/lib/sqlalchemy/dialects/sqlite/pysqlite.py +++ b/lib/sqlalchemy/dialects/sqlite/pysqlite.py @@ -504,8 +504,6 @@ class SQLiteDialect_pysqlite(SQLiteDialect): ) def on_connect(self): - connect = super(SQLiteDialect_pysqlite, self).on_connect() - def regexp(a, b): if b is None: return None @@ -524,13 +522,6 @@ class SQLiteDialect_pysqlite(SQLiteDialect): fns = [set_regexp] - if self.isolation_level is not None: - - def iso_level(conn): - self.set_isolation_level(conn, self.isolation_level) - - fns.append(iso_level) - def connect(conn): for fn in fns: fn(conn) -- cgit v1.2.1