2012-04-30 17:25:03 +00:00
|
|
|
|
DJ-Database-URL
|
2012-09-24 15:45:34 +00:00
|
|
|
|
~~~~~~~~~~~~~~~
|
2012-04-30 17:25:03 +00:00
|
|
|
|
|
2022-03-29 12:28:09 +00:00
|
|
|
|
.. image:: https://jazzband.co/static/img/badge.png
|
|
|
|
|
|
:target: https://jazzband.co/
|
|
|
|
|
|
:alt: Jazzband
|
|
|
|
|
|
|
2022-05-24 13:00:28 +00:00
|
|
|
|
.. image:: https://github.com/jazzband/dj-database-url/actions/workflows/test.yml/badge.svg
|
|
|
|
|
|
:target: https://github.com/jazzband/dj-database-url/actions/workflows/test.yml
|
2012-06-19 15:33:59 +00:00
|
|
|
|
|
2022-05-24 13:29:23 +00:00
|
|
|
|
.. image:: https://codecov.io/gh/jazzband/dj-database-url/branch/master/graph/badge.svg?token=7srBUpszOa
|
2022-05-24 15:00:20 +00:00
|
|
|
|
:target: https://codecov.io/gh/jazzband/dj-database-url
|
2022-05-24 13:29:23 +00:00
|
|
|
|
|
2012-04-30 17:25:03 +00:00
|
|
|
|
This simple Django utility allows you to utilize the
|
|
|
|
|
|
`12factor <http://www.12factor.net/backing-services>`_ inspired
|
2012-04-30 17:37:58 +00:00
|
|
|
|
``DATABASE_URL`` environment variable to configure your Django application.
|
|
|
|
|
|
|
2016-02-03 00:20:44 +00:00
|
|
|
|
The ``dj_database_url.config`` method returns a Django database connection
|
2016-02-03 00:19:28 +00:00
|
|
|
|
dictionary, populated with all the data specified in your URL. There is
|
|
|
|
|
|
also a `conn_max_age` argument to easily enable Django's connection pool.
|
|
|
|
|
|
|
|
|
|
|
|
If you'd rather not use an environment variable, you can pass a URL in directly
|
2016-02-03 00:20:44 +00:00
|
|
|
|
instead to ``dj_database_url.parse``.
|
2016-02-03 00:19:28 +00:00
|
|
|
|
|
|
|
|
|
|
Supported Databases
|
2014-04-18 06:35:07 +00:00
|
|
|
|
-------------------
|
|
|
|
|
|
|
2016-02-03 00:19:28 +00:00
|
|
|
|
Support currently exists for PostgreSQL, PostGIS, MySQL, MySQL (GIS),
|
2022-07-10 09:16:06 +00:00
|
|
|
|
Oracle, Oracle (GIS), Redshift, CockroachDB, Timescale, Timescale (GIS) and SQLite.
|
2014-04-18 06:35:07 +00:00
|
|
|
|
|
|
|
|
|
|
Installation
|
|
|
|
|
|
------------
|
|
|
|
|
|
|
2022-12-11 15:38:29 +00:00
|
|
|
|
Installation is simple:
|
|
|
|
|
|
|
|
|
|
|
|
.. code-block:: console
|
2014-04-18 06:35:07 +00:00
|
|
|
|
|
|
|
|
|
|
$ pip install dj-database-url
|
2012-04-30 17:25:03 +00:00
|
|
|
|
|
|
|
|
|
|
Usage
|
|
|
|
|
|
-----
|
|
|
|
|
|
|
2020-01-21 19:27:09 +00:00
|
|
|
|
1. If ``DATABASES`` is already defined:
|
|
|
|
|
|
|
2022-12-11 15:38:29 +00:00
|
|
|
|
- Configure your database in ``settings.py`` from ``DATABASE_URL``:
|
|
|
|
|
|
|
|
|
|
|
|
.. code-block:: python
|
|
|
|
|
|
|
|
|
|
|
|
import dj_database_url
|
2012-04-30 17:25:03 +00:00
|
|
|
|
|
2022-12-11 15:38:29 +00:00
|
|
|
|
DATABASES['default'] = dj_database_url.config(
|
|
|
|
|
|
conn_max_age=600,
|
|
|
|
|
|
conn_health_checks=True,
|
|
|
|
|
|
)
|
2016-02-03 00:19:28 +00:00
|
|
|
|
|
2022-12-11 15:38:29 +00:00
|
|
|
|
- Provide a default:
|
2016-02-03 00:19:28 +00:00
|
|
|
|
|
2022-12-11 15:38:29 +00:00
|
|
|
|
.. code-block:: python
|
2016-02-03 00:19:28 +00:00
|
|
|
|
|
2022-12-11 15:38:29 +00:00
|
|
|
|
DATABASES['default'] = dj_database_url.config(
|
|
|
|
|
|
default='postgres://...',
|
|
|
|
|
|
conn_max_age=600,
|
|
|
|
|
|
conn_health_checks=True,
|
|
|
|
|
|
)
|
2012-04-30 17:25:03 +00:00
|
|
|
|
|
2022-12-11 15:38:29 +00:00
|
|
|
|
- Parse an arbitrary Database URL:
|
2012-04-30 19:08:20 +00:00
|
|
|
|
|
2022-12-11 15:38:29 +00:00
|
|
|
|
.. code-block:: python
|
|
|
|
|
|
|
|
|
|
|
|
DATABASES['default'] = dj_database_url.parse(
|
|
|
|
|
|
'postgres://...',
|
|
|
|
|
|
conn_max_age=600,
|
|
|
|
|
|
conn_health_checks=True,
|
|
|
|
|
|
)
|
2015-05-11 05:35:47 +00:00
|
|
|
|
|
2020-01-21 19:27:09 +00:00
|
|
|
|
2. If ``DATABASES`` is not defined:
|
|
|
|
|
|
|
2022-12-11 15:38:29 +00:00
|
|
|
|
- Configure your database in ``settings.py`` from ``DATABASE_URL``:
|
|
|
|
|
|
|
|
|
|
|
|
.. code-block:: python
|
|
|
|
|
|
|
|
|
|
|
|
import dj_database_url
|
2020-01-21 19:27:09 +00:00
|
|
|
|
|
2022-12-11 15:38:29 +00:00
|
|
|
|
DATABASES = {
|
|
|
|
|
|
'default': dj_database_url.config(
|
|
|
|
|
|
conn_max_age=600,
|
|
|
|
|
|
conn_health_checks=True,
|
|
|
|
|
|
),
|
|
|
|
|
|
}
|
2020-01-21 19:27:09 +00:00
|
|
|
|
|
2022-12-11 15:38:29 +00:00
|
|
|
|
- You can provide a default, used if the ``DATABASE_URL`` setting is not defined:
|
2020-01-21 19:27:09 +00:00
|
|
|
|
|
2022-12-11 15:38:29 +00:00
|
|
|
|
.. code-block:: python
|
2020-01-21 19:27:09 +00:00
|
|
|
|
|
2022-12-11 15:38:29 +00:00
|
|
|
|
DATABASES = {
|
|
|
|
|
|
'default': dj_database_url.config(
|
|
|
|
|
|
default='postgres://...',
|
|
|
|
|
|
conn_max_age=600,
|
|
|
|
|
|
conn_health_checks=True,
|
|
|
|
|
|
)
|
|
|
|
|
|
}
|
2020-01-21 19:27:09 +00:00
|
|
|
|
|
2022-12-11 15:38:29 +00:00
|
|
|
|
- Parse an arbitrary Database URL:
|
2020-01-21 19:27:09 +00:00
|
|
|
|
|
2022-12-11 15:38:29 +00:00
|
|
|
|
.. code-block:: python
|
2020-01-21 19:27:09 +00:00
|
|
|
|
|
2022-12-11 15:38:29 +00:00
|
|
|
|
DATABASES = {
|
|
|
|
|
|
'default': dj_database_url.parse(
|
|
|
|
|
|
'postgres://...',
|
|
|
|
|
|
conn_max_age=600,
|
|
|
|
|
|
conn_health_checks=True,
|
|
|
|
|
|
)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
``conn_max_age`` sets the |CONN_MAX_AGE setting|__, which tells Django to
|
|
|
|
|
|
persist database connections between requests, up to the given lifetime in
|
|
|
|
|
|
seconds. If you do not provide a value, it will follow Django’s default of
|
|
|
|
|
|
``0``. Setting it is recommended for performance.
|
|
|
|
|
|
|
|
|
|
|
|
.. |CONN_MAX_AGE setting| replace:: ``CONN_MAX_AGE`` setting
|
|
|
|
|
|
__ https://docs.djangoproject.com/en/stable/ref/settings/#conn-max-age
|
|
|
|
|
|
|
|
|
|
|
|
``conn_health_checks`` sets the |CONN_HEALTH_CHECKS setting|__ (new in Django
|
|
|
|
|
|
4.1), which tells Django to check a persisted connection still works at the
|
|
|
|
|
|
start of each request. If you do not provide a value, it will follow Django’s
|
|
|
|
|
|
default of ``False``. Enabling it is recommended if you set a non-zero
|
|
|
|
|
|
``conn_max_age``.
|
|
|
|
|
|
|
|
|
|
|
|
.. |CONN_HEALTH_CHECKS setting| replace:: ``CONN_HEALTH_CHECKS`` setting
|
|
|
|
|
|
__ https://docs.djangoproject.com/en/stable/ref/settings/#conn-health-checks
|
2012-04-30 17:25:03 +00:00
|
|
|
|
|
2022-05-25 21:23:35 +00:00
|
|
|
|
Strings passed to `dj_database_url` must be valid URLs; in
|
|
|
|
|
|
particular, special characters must be url-encoded. The following url will raise
|
2022-12-11 15:38:29 +00:00
|
|
|
|
a `ValueError`:
|
|
|
|
|
|
|
|
|
|
|
|
.. code-block:: plaintext
|
2022-07-29 09:40:38 +00:00
|
|
|
|
|
2022-05-25 21:23:35 +00:00
|
|
|
|
postgres://user:p#ssword!@localhost/foobar
|
2022-07-29 09:40:38 +00:00
|
|
|
|
|
2022-12-11 15:38:29 +00:00
|
|
|
|
and should instead be passed as:
|
|
|
|
|
|
|
|
|
|
|
|
.. code-block:: plaintext
|
2022-07-29 09:40:38 +00:00
|
|
|
|
|
2022-05-25 21:23:35 +00:00
|
|
|
|
postgres://user:p%23ssword!@localhost/foobar
|
|
|
|
|
|
|
2022-12-12 14:56:50 +00:00
|
|
|
|
`TEST <https://docs.djangoproject.com/en/stable/ref/settings/#test>`_ settings can be configured using the ``test_options`` attribute::
|
|
|
|
|
|
|
|
|
|
|
|
DATABASES['default'] = dj_database_url.config(default='postgres://...', test_options={'NAME': 'mytestdatabase'})
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-04-18 06:35:07 +00:00
|
|
|
|
URL schema
|
|
|
|
|
|
----------
|
|
|
|
|
|
|
2022-07-10 09:16:06 +00:00
|
|
|
|
+----------------------+-----------------------------------------------+--------------------------------------------------+
|
|
|
|
|
|
| Engine | Django Backend | URL |
|
|
|
|
|
|
+======================+===============================================+==================================================+
|
|
|
|
|
|
| PostgreSQL | ``django.db.backends.postgresql`` [1]_ | ``postgres://USER:PASSWORD@HOST:PORT/NAME`` [2]_ |
|
|
|
|
|
|
+----------------------+-----------------------------------------------+--------------------------------------------------+
|
|
|
|
|
|
| PostGIS | ``django.contrib.gis.db.backends.postgis`` | ``postgis://USER:PASSWORD@HOST:PORT/NAME`` |
|
|
|
|
|
|
+----------------------+-----------------------------------------------+--------------------------------------------------+
|
|
|
|
|
|
| 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`` |
|
|
|
|
|
|
+----------------------+-----------------------------------------------+--------------------------------------------------+
|
|
|
|
|
|
| SQLite | ``django.db.backends.sqlite3`` | ``sqlite:///PATH`` [3]_ |
|
|
|
|
|
|
+----------------------+-----------------------------------------------+--------------------------------------------------+
|
|
|
|
|
|
| SpatiaLite | ``django.contrib.gis.db.backends.spatialite`` | ``spatialite:///PATH`` [3]_ |
|
|
|
|
|
|
+----------------------+-----------------------------------------------+--------------------------------------------------+
|
|
|
|
|
|
| Oracle | ``django.db.backends.oracle`` | ``oracle://USER:PASSWORD@HOST:PORT/NAME`` [4]_ |
|
|
|
|
|
|
+----------------------+-----------------------------------------------+--------------------------------------------------+
|
|
|
|
|
|
| Oracle (GIS) | ``django.contrib.gis.db.backends.oracle`` | ``oraclegis://USER:PASSWORD@HOST:PORT/NAME`` |
|
|
|
|
|
|
+----------------------+-----------------------------------------------+--------------------------------------------------+
|
|
|
|
|
|
| Redshift | ``django_redshift_backend`` | ``redshift://USER:PASSWORD@HOST:PORT/NAME`` |
|
|
|
|
|
|
+----------------------+-----------------------------------------------+--------------------------------------------------+
|
|
|
|
|
|
| CockroachDB | ``django_cockroachdb`` | ``cockroach://USER:PASSWORD@HOST:PORT/NAME`` |
|
|
|
|
|
|
+----------------------+-----------------------------------------------+--------------------------------------------------+
|
|
|
|
|
|
| Timescale [6]_ | ``timescale.db.backends.postgresql`` | ``timescale://USER:PASSWORD@HOST:PORT/NAME`` |
|
|
|
|
|
|
+----------------------+-----------------------------------------------+--------------------------------------------------+
|
|
|
|
|
|
| Timescale (GIS) [6]_ | ``timescale.db.backend.postgis`` | ``timescalegis://USER:PASSWORD@HOST:PORT/NAME`` |
|
|
|
|
|
|
+----------------------+-----------------------------------------------+--------------------------------------------------+
|
2014-02-04 15:18:18 +00:00
|
|
|
|
|
2019-07-12 20:37:18 +00:00
|
|
|
|
.. [1] The django.db.backends.postgresql backend is named django.db.backends.postgresql_psycopg2 in older releases. For
|
|
|
|
|
|
backwards compatibility, the old name still works in newer versions. (The new name does not work in older versions).
|
|
|
|
|
|
.. [2] With PostgreSQL, you can also use unix domain socket paths with
|
2014-02-04 15:18:18 +00:00
|
|
|
|
`percent encoding <http://www.postgresql.org/docs/9.2/interactive/libpq-connect.html#AEN38162>`_:
|
|
|
|
|
|
``postgres://%2Fvar%2Flib%2Fpostgresql/dbname``.
|
2019-07-12 20:37:18 +00:00
|
|
|
|
.. [3] SQLite connects to file based databases. The same URL format is used, omitting
|
2014-04-18 06:35:07 +00:00
|
|
|
|
the hostname, and using the "file" portion as the filename of the database.
|
|
|
|
|
|
This has the effect of four slashes being present for an absolute file path:
|
|
|
|
|
|
``sqlite:////full/path/to/your/database/file.sqlite``.
|
2019-07-12 20:37:18 +00:00
|
|
|
|
.. [4] Note that when connecting to Oracle the URL isn't in the form you may know
|
2014-10-24 18:48:14 +00:00
|
|
|
|
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.
|
2022-05-28 20:18:21 +00:00
|
|
|
|
.. [5] Microsoft official `mssql-django <https://github.com/microsoft/mssql-django>`_ adapter.
|
2022-07-10 09:16:06 +00:00
|
|
|
|
.. [6] Using the django-timescaledb Package which must be installed.
|
|
|
|
|
|
|
2022-01-11 12:39:25 +00:00
|
|
|
|
|
|
|
|
|
|
Contributing
|
|
|
|
|
|
------------
|
|
|
|
|
|
|
|
|
|
|
|
We welcome contributions to this project. Projects can take two forms:
|
|
|
|
|
|
|
|
|
|
|
|
1. Raising issues or helping others through the github issue tracker.
|
|
|
|
|
|
2. Contributing code.
|
|
|
|
|
|
|
|
|
|
|
|
Raising Issues or helping others:
|
|
|
|
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
|
|
|
|
|
|
|
When submitting an issue or helping other remember you are talking to humans who have feelings, jobs and lives of their
|
|
|
|
|
|
own. Be nice, be kind, be polite. Remember english may not be someone first language, if you do not understand or
|
|
|
|
|
|
something is not clear be polite and re-ask/ re-word.
|
|
|
|
|
|
|
|
|
|
|
|
Contributing code:
|
|
|
|
|
|
^^^^^^^^^^^^^^^^^^
|
|
|
|
|
|
|
|
|
|
|
|
* Before writing code be sure to check existing PR's and issues in the tracker.
|
|
|
|
|
|
* Write code to the pylint spec.
|
|
|
|
|
|
* Large or wide sweeping changes will take longer, and may face more scrutiny than smaller confined changes.
|
|
|
|
|
|
* Code should be pass `black` and `flake8` validation.
|