diff --git a/README.rst b/README.rst index 321326e..d502908 100644 --- a/README.rst +++ b/README.rst @@ -24,14 +24,19 @@ Usage ----- Configure your database in ``settings.py`` from ``DATABASE_URL`` -(``default`` is optional):: +(``default`` and ``conn_max_age`` are optional):: import dj_database_url - DATABASES = {'default': dj_database_url.config(default='postgres://...')} + DATABASES = {'default': dj_database_url.config(default='postgres://...', conn_max_age=600 )} Parse an arbitrary Database URL:: - DATABASES = {'default': dj_database_url.parse('postgres://...')} + DATABASES = {'default': dj_database_url.parse('postgres://...', conn_max_age=600)} + +The ``conn_max_age`` attribute is the lifetime of a database connection in seconds +and is available in Django 1.6+. If you do not set a value, it will default to ``0`` +which is Django's historical behavior of using a new database connection on each +request. Use ``None`` for unlimited persistent connections. URL schema ---------- diff --git a/dj_database_url.py b/dj_database_url.py index 8a73c71..37975fc 100644 --- a/dj_database_url.py +++ b/dj_database_url.py @@ -35,7 +35,7 @@ SCHEMES = { } -def config(env=DEFAULT_ENV, default=None, engine=None): +def config(env=DEFAULT_ENV, default=None, engine=None, conn_max_age=0): """Returns configured DATABASE dictionary from DATABASE_URL.""" config = {} @@ -43,12 +43,12 @@ def config(env=DEFAULT_ENV, default=None, engine=None): s = os.environ.get(env, default) if s: - config = parse(s, engine) + config = parse(s, engine, conn_max_age) return config -def parse(url, engine=None): +def parse(url, engine=None, conn_max_age=0): """Parses a database URL.""" if url == 'sqlite://:memory:': @@ -87,6 +87,7 @@ def parse(url, engine=None): 'PASSWORD': url.password or '', 'HOST': hostname, 'PORT': url.port or '', + 'CONN_MAX_AGE': conn_max_age, }) if engine: diff --git a/test_dj_database_url.py b/test_dj_database_url.py index 001960a..d4c6c44 100644 --- a/test_dj_database_url.py +++ b/test_dj_database_url.py @@ -110,6 +110,20 @@ class DatabaseTestSuite(unittest.TestCase): url = dj_database_url.config(engine=engine) assert url['ENGINE'] == engine + + def test_parse_conn_max_age_setting(self): + conn_max_age = 600 + url = 'mysql://bea6eb025ca0d8:69772142@us-cdbr-east.cleardb.com/heroku_97681db3eff7580?reconnect=true' + url = dj_database_url.parse(url, conn_max_age=conn_max_age) + + assert url['CONN_MAX_AGE'] == conn_max_age + + def test_config_conn_max_age_setting(self): + conn_max_age = 600 + os.environ['DATABASE_URL'] = 'mysql://bea6eb025ca0d8:69772142@us-cdbr-east.cleardb.com/heroku_97681db3eff7580?reconnect=true' + url = dj_database_url.config(conn_max_age=conn_max_age) + + assert url['CONN_MAX_AGE'] == conn_max_age if __name__ == '__main__': unittest.main()