diff options
| author | mike bayer <mike_mp@zzzcomputing.com> | 2020-06-01 19:43:04 +0000 |
|---|---|---|
| committer | Gerrit Code Review <gerrit@bbpush.zzzcomputing.com> | 2020-06-01 19:43:04 +0000 |
| commit | 1287853bf59a3e50b0a518d4410ff60305058131 (patch) | |
| tree | eb525241420c5e919025550cdfdf7fb6d3f47181 /lib/sqlalchemy/dialects/mssql | |
| parent | a31a07ddad1812072511ee69b4e95be099330804 (diff) | |
| parent | a7a19f292451e10aef489d87df27be7f58f831a8 (diff) | |
| download | sqlalchemy-1287853bf59a3e50b0a518d4410ff60305058131.tar.gz | |
Merge "Support multiple dotted sections in mssql schema names"
Diffstat (limited to 'lib/sqlalchemy/dialects/mssql')
| -rw-r--r-- | lib/sqlalchemy/dialects/mssql/base.py | 44 |
1 files changed, 35 insertions, 9 deletions
diff --git a/lib/sqlalchemy/dialects/mssql/base.py b/lib/sqlalchemy/dialects/mssql/base.py index 9a38a7881..c35ab2880 100644 --- a/lib/sqlalchemy/dialects/mssql/base.py +++ b/lib/sqlalchemy/dialects/mssql/base.py @@ -2314,8 +2314,7 @@ def _switch_db(dbname, connection, fn, *arg, **kw): current_db = connection.exec_driver_sql("select db_name()").scalar() if current_db != dbname: connection.exec_driver_sql( - "use %s" - % connection.dialect.identifier_preparer.quote_schema(dbname) + "use %s" % connection.dialect.identifier_preparer.quote(dbname) ) try: return fn(*arg, **kw) @@ -2323,9 +2322,7 @@ def _switch_db(dbname, connection, fn, *arg, **kw): if dbname and current_db != dbname: connection.exec_driver_sql( "use %s" - % connection.dialect.identifier_preparer.quote_schema( - current_db - ) + % connection.dialect.identifier_preparer.quote(current_db) ) @@ -2338,33 +2335,62 @@ def _owner_plus_db(dialect, schema): return None, schema +_memoized_schema = util.LRUCache() + + def _schema_elements(schema): if isinstance(schema, quoted_name) and schema.quote: return None, schema + if schema in _memoized_schema: + return _memoized_schema[schema] + + # tests for this function are in: + # test/dialect/mssql/test_reflection.py -> + # OwnerPlusDBTest.test_owner_database_pairs + # test/dialect/mssql/test_compiler.py -> test_force_schema_* + # test/dialect/mssql/test_compiler.py -> test_schema_many_tokens_* + # + push = [] symbol = "" bracket = False + has_brackets = False for token in re.split(r"(\[|\]|\.)", schema): if not token: continue if token == "[": bracket = True + has_brackets = True elif token == "]": bracket = False elif not bracket and token == ".": - push.append(symbol) + if has_brackets: + push.append("[%s]" % symbol) + else: + push.append(symbol) symbol = "" + has_brackets = False else: symbol += token if symbol: push.append(symbol) if len(push) > 1: - return push[0], "".join(push[1:]) + dbname, owner = ".".join(push[0:-1]), push[-1] + + # test for internal brackets + if re.match(r".*\].*\[.*", dbname[1:-1]): + dbname = quoted_name(dbname, quote=False) + else: + dbname = dbname.lstrip("[").rstrip("]") + elif len(push): - return None, push[0] + dbname, owner = None, push[0] else: - return None, None + dbname, owner = None, None + + _memoized_schema[schema] = dbname, owner + return dbname, owner class MSDialect(default.DefaultDialect): |
