diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2020-08-21 14:44:04 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2020-08-25 20:10:16 -0400 |
commit | 3668b3a30c4b9a9f4af13457f43bfc34c28cf448 (patch) | |
tree | 6be6b991de7f3eb06181fd045b003e1b6d7e250e /lib/sqlalchemy/dialects | |
parent | 9b6b867fe59d74c23edca782dcbba9af99b62817 (diff) | |
download | sqlalchemy-3668b3a30c4b9a9f4af13457f43bfc34c28cf448.tar.gz |
make URL immutable
it's not really correct that URL is mutable and doesn't do
any argument checking. propose replacing it with an immutable
named tuple with rich copy-and-mutate methods.
At the moment this makes a hard change to the CreateEnginePlugin
docs that previously recommended url.query.pop(). I can't find
any plugins on github other than my own that are using this
feature, so see if we can just make a hard change on this one.
Fixes: #5526
Change-Id: I28a0a471d80792fa8c28f4fa573d6352966a4a79
Diffstat (limited to 'lib/sqlalchemy/dialects')
-rw-r--r-- | lib/sqlalchemy/dialects/mysql/provision.py | 11 | ||||
-rw-r--r-- | lib/sqlalchemy/dialects/oracle/provision.py | 4 | ||||
-rw-r--r-- | lib/sqlalchemy/dialects/sqlite/pysqlite.py | 2 |
3 files changed, 6 insertions, 11 deletions
diff --git a/lib/sqlalchemy/dialects/mysql/provision.py b/lib/sqlalchemy/dialects/mysql/provision.py index bbe752d78..a1d82222d 100644 --- a/lib/sqlalchemy/dialects/mysql/provision.py +++ b/lib/sqlalchemy/dialects/mysql/provision.py @@ -1,5 +1,3 @@ -import copy - from ... import exc from ...testing.provision import configure_follower from ...testing.provision import create_db @@ -9,7 +7,7 @@ from ...testing.provision import temp_table_keyword_args @generate_driver_url.for_db("mysql", "mariadb") -def generate_driver_url(url, driver, query): +def generate_driver_url(url, driver, query_str): backend = url.get_backend_name() if backend == "mysql": @@ -17,10 +15,9 @@ def generate_driver_url(url, driver, query): if dialect_cls._is_mariadb_from_url(url): backend = "mariadb" - new_url = copy.copy(url) - new_url.query = dict(new_url.query) - new_url.drivername = "%s+%s" % (backend, driver) - new_url.query.update(query) + new_url = url.set( + drivername="%s+%s" % (backend, driver) + ).update_query_string(query_str) try: new_url.get_dialect() diff --git a/lib/sqlalchemy/dialects/oracle/provision.py b/lib/sqlalchemy/dialects/oracle/provision.py index 9de14bff0..01854fdce 100644 --- a/lib/sqlalchemy/dialects/oracle/provision.py +++ b/lib/sqlalchemy/dialects/oracle/provision.py @@ -97,9 +97,7 @@ def _reap_oracle_dbs(url, idents): @follower_url_from_main.for_db("oracle") def _oracle_follower_url_from_main(url, ident): url = sa_url.make_url(url) - url.username = ident - url.password = "xe" - return url + return url.set(username=ident, password="xe") @temp_table_keyword_args.for_db("oracle") diff --git a/lib/sqlalchemy/dialects/sqlite/pysqlite.py b/lib/sqlalchemy/dialects/sqlite/pysqlite.py index 8da2a0323..3c88dab8e 100644 --- a/lib/sqlalchemy/dialects/sqlite/pysqlite.py +++ b/lib/sqlalchemy/dialects/sqlite/pysqlite.py @@ -491,7 +491,7 @@ class SQLiteDialect_pysqlite(SQLiteDialect): util.coerce_kw_type(opts, key, type_, dest=pysqlite_opts) if pysqlite_opts.get("uri", False): - uri_opts = opts.copy() + uri_opts = dict(opts) # here, we are actually separating the parameters that go to # sqlite3/pysqlite vs. those that go the SQLite URI. What if # two names conflict? again, this seems to be not the case right |