diff --git a/dj_database_url.py b/dj_database_url.py index 37975fc..a3defda 100644 --- a/dj_database_url.py +++ b/dj_database_url.py @@ -66,9 +66,13 @@ def parse(url, engine=None, conn_max_age=0): url = urlparse.urlparse(url) - # Remove query strings. + # Split query strings from path. path = url.path[1:] - path = path.split('?', 2)[0] + if '?' in path and not url.query: + path, query = path.split('?', 2) + else: + path, query = path, url.query + query = urlparse.parse_qs(query) # If we are using sqlite and we have no path, then assume we # want an in-memory database (this is the behaviour of sqlalchemy) @@ -95,4 +99,14 @@ def parse(url, engine=None, conn_max_age=0): elif url.scheme in SCHEMES: config['ENGINE'] = SCHEMES[url.scheme] + if config['ENGINE'] == 'django.db.backends.postgresql_psycopg2': + try: + current_schema = query['currentSchema'][0] + except (KeyError, IndexError): + pass + else: + config['OPTIONS'] = { + 'options': '-c search_path=' + current_schema + } + return config diff --git a/test_dj_database_url.py b/test_dj_database_url.py index d4c6c44..f20d3a3 100644 --- a/test_dj_database_url.py +++ b/test_dj_database_url.py @@ -34,6 +34,17 @@ class DatabaseTestSuite(unittest.TestCase): assert url['PASSWORD'] == '' assert url['PORT'] == '' + def test_postgres_search_path_parsing(self): + url = 'postgres://uf07k1i6d8ia0v:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com:5431/d8r82722r2kuvn?currentSchema=otherschema' + url = dj_database_url.parse(url) + assert url['ENGINE'] == 'django.db.backends.postgresql_psycopg2' + 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'] == 5431 + assert url['OPTIONS'] == {'options': '-c search_path=otherschema'} + def test_postgis_parsing(self): url = 'postgis://uf07k1i6d8ia0v:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com:5431/d8r82722r2kuvn' url = dj_database_url.parse(url) diff --git a/tox.ini b/tox.ini new file mode 100644 index 0000000..bfbad6a --- /dev/null +++ b/tox.ini @@ -0,0 +1,6 @@ +[tox] +envlist = py{26,27,32,33,34} + + +[testenv] +commands = python test_dj_database_url.py