diff --git a/dj_database_url/__init__.py b/dj_database_url/__init__.py index 9cf9787..17b6490 100644 --- a/dj_database_url/__init__.py +++ b/dj_database_url/__init__.py @@ -172,10 +172,13 @@ def parse( options["ssl"] = {"ca": values[-1]} continue - try: - options[key] = int(values[-1]) - except (TypeError, ValueError): - options[key] = values[-1] + value = values[-1] + if value.isdigit(): + options[key] = int(value) + elif value.lower() in ("true", "false"): + options[key] = value.lower() == "true" + else: + options[key] = value if ssl_require: options["sslmode"] = "require" diff --git a/tests/test_dj_database_url.py b/tests/test_dj_database_url.py index f8a38d0..6e46e27 100644 --- a/tests/test_dj_database_url.py +++ b/tests/test_dj_database_url.py @@ -84,6 +84,21 @@ def test_postgres_parsing_with_special_characters(self): assert url["PASSWORD"] == "#password" assert url["PORT"] == 5431 + def test_postgres_parsing_with_int_bool_str_query_string(self): + url = "postgres://uf07k1i6d8ia0v:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com:5431/d8r82722r2kuvn?server_side_binding=true&timeout=20&service=my_service&passfile=.my_pgpass" + url = dj_database_url.parse(url) + + assert url["ENGINE"] == "django.db.backends.postgresql" + 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"]["server_side_binding"] is True + assert url["OPTIONS"]["timeout"] == 20 + assert url["OPTIONS"]["service"] == "my_service" + assert url["OPTIONS"]["passfile"] == ".my_pgpass" + 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)