summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorFederico Caselli <cfederico87@gmail.com>2022-06-20 20:41:48 +0200
committerFederico Caselli <cfederico87@gmail.com>2022-06-20 20:41:48 +0200
commite13e13421681768c300eab192cf2b150db9edaa6 (patch)
tree58346afef14358439a2b91b50c52c7d8dc4d2c19 /lib
parent5785b59482498996835dc148fa5f77db36a0705a (diff)
downloadsqlalchemy-e13e13421681768c300eab192cf2b150db9edaa6.tar.gz
Add ability to test using thick mode with oracledb
Change-Id: Iee14750ba20422931bde4d61eaa570af482c7d8b References: #8147
Diffstat (limited to 'lib')
-rw-r--r--lib/sqlalchemy/dialects/oracle/oracledb.py2
-rw-r--r--lib/sqlalchemy/dialects/oracle/provision.py11
-rw-r--r--lib/sqlalchemy/testing/plugin/plugin_base.py18
-rw-r--r--lib/sqlalchemy/testing/provision.py26
4 files changed, 43 insertions, 14 deletions
diff --git a/lib/sqlalchemy/dialects/oracle/oracledb.py b/lib/sqlalchemy/dialects/oracle/oracledb.py
index bbe801cd4..67c5b42a5 100644
--- a/lib/sqlalchemy/dialects/oracle/oracledb.py
+++ b/lib/sqlalchemy/dialects/oracle/oracledb.py
@@ -76,7 +76,7 @@ class OracleDialect_oracledb(_OracleDialect_cx_oracle):
**kwargs,
)
- if thick_mode is not None:
+ if self.dbapi is not None and thick_mode is not None:
kw = thick_mode if isinstance(thick_mode, dict) else {}
self.dbapi.init_oracle_client(**kw)
diff --git a/lib/sqlalchemy/dialects/oracle/provision.py b/lib/sqlalchemy/dialects/oracle/provision.py
index 75b7a7aa9..6644c6eab 100644
--- a/lib/sqlalchemy/dialects/oracle/provision.py
+++ b/lib/sqlalchemy/dialects/oracle/provision.py
@@ -16,6 +16,7 @@ from ...testing.provision import run_reap_dbs
from ...testing.provision import set_default_schema_on_connection
from ...testing.provision import stop_test_class_outside_fixtures
from ...testing.provision import temp_table_keyword_args
+from ...testing.provision import update_db_opts
@create_db.for_db("oracle")
@@ -204,3 +205,13 @@ def _oracle_set_default_schema_on_connection(
cursor = dbapi_connection.cursor()
cursor.execute("ALTER SESSION SET CURRENT_SCHEMA=%s" % schema_name)
cursor.close()
+
+
+@update_db_opts.for_db("oracle")
+def _update_db_opts(db_url, db_opts, options):
+ """Set database options (db_opts) for a test database that we created."""
+ if (
+ options.oracledb_thick_mode
+ and sa_url.make_url(db_url).get_driver_name() == "oracledb"
+ ):
+ db_opts["thick_mode"] = True
diff --git a/lib/sqlalchemy/testing/plugin/plugin_base.py b/lib/sqlalchemy/testing/plugin/plugin_base.py
index c20110071..8e5113954 100644
--- a/lib/sqlalchemy/testing/plugin/plugin_base.py
+++ b/lib/sqlalchemy/testing/plugin/plugin_base.py
@@ -149,12 +149,6 @@ def setup_options(make_option):
help="Filename where a single profile run will be dumped",
)
make_option(
- "--postgresql-templatedb",
- type=str,
- help="name of template database to use for PostgreSQL "
- "CREATE DATABASE (defaults to current database)",
- )
- make_option(
"--low-connections",
action="store_true",
dest="low_connections",
@@ -220,6 +214,18 @@ def setup_options(make_option):
help="Additional test directories to add to the mypy tests. "
"This is used only when running mypy tests. Multiple OK",
)
+ # db specific options
+ make_option(
+ "--postgresql-templatedb",
+ type=str,
+ help="name of template database to use for PostgreSQL "
+ "CREATE DATABASE (defaults to current database)",
+ )
+ make_option(
+ "--oracledb-thick-mode",
+ action="store_true",
+ help="enables the 'thick mode' when testing with oracle+oracledb",
+ )
def configure_follower(follower_ident):
diff --git a/lib/sqlalchemy/testing/provision.py b/lib/sqlalchemy/testing/provision.py
index 498d92a77..12448b2fe 100644
--- a/lib/sqlalchemy/testing/provision.py
+++ b/lib/sqlalchemy/testing/provision.py
@@ -21,15 +21,22 @@ FOLLOWER_IDENT = None
class register:
- def __init__(self):
+ def __init__(self, decorator=None):
self.fns = {}
+ self.decorator = decorator
@classmethod
def init(cls, fn):
return register().for_db("*")(fn)
+ @classmethod
+ def init_decorator(cls, decorator):
+ return register(decorator).for_db("*")
+
def for_db(self, *dbnames):
def decorate(fn):
+ if self.decorator:
+ fn = self.decorator(fn)
for dbname in dbnames:
self.fns[dbname] = fn
return self
@@ -66,7 +73,7 @@ def setup_config(db_url, options, file_config, follower_ident):
if follower_ident:
db_url = follower_url_from_main(db_url, follower_ident)
db_opts = {}
- update_db_opts(db_url, db_opts)
+ update_db_opts(db_url, db_opts, options)
db_opts["scope"] = "global"
eng = engines.testing_engine(db_url, db_opts)
post_configure_engine(db_url, eng, follower_ident)
@@ -331,10 +338,17 @@ def drop_db(cfg, eng, ident):
raise NotImplementedError("no DB drop routine for cfg: %s" % (eng.url,))
-@register.init
-def update_db_opts(db_url, db_opts):
+def _adapt_update_db_opts(fn):
+ insp = util.inspect_getfullargspec(fn)
+ if len(insp.args) == 3:
+ return fn
+ else:
+ return lambda db_url, db_opts, _options: fn(db_url, db_opts)
+
+
+@register.init_decorator(_adapt_update_db_opts)
+def update_db_opts(db_url, db_opts, options):
"""Set database options (db_opts) for a test database that we created."""
- pass
@register.init
@@ -343,7 +357,6 @@ def post_configure_engine(url, engine, follower_ident):
(For the internal dialects, currently only used by sqlite, oracle)
"""
- pass
@register.init
@@ -374,7 +387,6 @@ def run_reap_dbs(url, ident):
use. For the internal dialects, this is currently only necessary for
mssql and oracle.
"""
- pass
def reap_dbs(idents_file):