diff --git a/README.rst b/README.rst index e54b069..47665d2 100644 --- a/README.rst +++ b/README.rst @@ -94,6 +94,8 @@ URL schema +-------------+-----------------------------------------------+--------------------------------------------------+ | MSSQL | ``sql_server.pyodbc`` | ``mssql://USER:PASSWORD@HOST:PORT/NAME`` | +-------------+-----------------------------------------------+--------------------------------------------------+ +| MSSQL [5]_ | ``mssql`` | ``mssqlms://USER:PASSWORD@HOST:PORT/NAME`` | ++-------------+-----------------------------------------------+--------------------------------------------------+ | MySQL | ``django.db.backends.mysql`` | ``mysql://USER:PASSWORD@HOST:PORT/NAME`` | +-------------+-----------------------------------------------+--------------------------------------------------+ | MySQL (GIS) | ``django.contrib.gis.db.backends.mysql`` | ``mysqlgis://USER:PASSWORD@HOST:PORT/NAME`` | @@ -124,6 +126,7 @@ URL schema from using other Oracle tools (like SQLPlus) i.e. user and password are separated by ``:`` not by ``/``. Also you can omit ``HOST`` and ``PORT`` and provide a full DSN string or TNS name in ``NAME`` part. +.. [5] Microsoft official `mssql-django `_ adapter. Contributing ------------ diff --git a/dj_database_url.py b/dj_database_url.py index 9bd7661..77daf25 100644 --- a/dj_database_url.py +++ b/dj_database_url.py @@ -23,6 +23,7 @@ urlparse.uses_netloc.append("mysql2") urlparse.uses_netloc.append("mysqlgis") urlparse.uses_netloc.append("mysql-connector") urlparse.uses_netloc.append("mssql") +urlparse.uses_netloc.append("mssqlms") urlparse.uses_netloc.append("spatialite") urlparse.uses_netloc.append("sqlite") urlparse.uses_netloc.append("oracle") @@ -39,6 +40,7 @@ SCHEMES = { "mysqlgis": "django.contrib.gis.db.backends.mysql", "mysql-connector": "mysql.connector.django", "mssql": "sql_server.pyodbc", + "mssqlms": "mssql", "spatialite": "django.contrib.gis.db.backends.spatialite", "sqlite": "django.db.backends.sqlite3", "oracle": "django.db.backends.oracle", @@ -117,7 +119,8 @@ def parse(url, engine=None, conn_max_age=0, ssl_require=False): port = ( str(url.port) - if url.port and engine in [SCHEMES["oracle"], SCHEMES["mssql"]] + if url.port + and engine in [SCHEMES["oracle"], SCHEMES["mssql"], SCHEMES["mssqlms"]] else url.port ) diff --git a/test_dj_database_url.py b/test_dj_database_url.py index b8accfd..0dbe93a 100644 --- a/test_dj_database_url.py +++ b/test_dj_database_url.py @@ -355,6 +355,19 @@ class DatabaseTestSuite(unittest.TestCase): assert url['OPTIONS']['sslcert'] == '/certs/client.myprojectuser.crt' assert url['OPTIONS']['sslkey'] == '/certs/client.myprojectuser.key' + def test_mssqlms_parsing(self): + url = "mssqlms://uf07k1i6d8ia0v:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com/d8r82722r2kuvn?driver=ODBC Driver 13 for SQL Server" + url = dj_database_url.parse(url) + + assert url["ENGINE"] == "mssql" + assert url["NAME"] == "d8r82722r2kuvn" + assert url["HOST"] == "ec2-107-21-253-135.compute-1.amazonaws.com" + assert url["USER"] == "uf07k1i6d8ia0v" + assert url["PASSWORD"] == "wegauwhgeuioweg" + assert url["PORT"] == "" + assert url["OPTIONS"]["driver"] == "ODBC Driver 13 for SQL Server" + assert "currentSchema" not in url["OPTIONS"] + if __name__ == "__main__": unittest.main()