Search code examples
python-3.xdjangodjango-modelsneo4jneomodel

How to connect to Neo4J's AuraDB (free tier) from Django?


I have added the the following lines to my settings.py as follows:

from neomodel import config
import dj_database_url

NEOMODEL_NEO4J_BOLT_URL = 'neo4j+s://xxxxxxx.databases.neo4j.io'
NEOMODEL_SIGNALS = True
NEOMODEL_FORCE_TIMEZONE = False
NEOMODEL_ENCRYPTED_CONNECTION = False
NEOMODEL_MAX_CONNECTION_POOL_SIZE = 50

user = 'neo4j'
psw = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
uri = 'neo4j+ssc://xxxxxxxx.databases.neo4j.io'

DATABASE_URL = 'neo4j+ssc://{}:{}@{}'.format(user, psw, uri)
config.DATABASE_URL = 'neo4j+ssc://{}:{}@{}'.format(user, psw, uri)
DATABASES = {'default': dj_database_url.config(default=DATABASE_URL)}

And I get this error when I run python manage.py migrate:

Traceback (most recent call last):
  File "manage.py", line 22, in <module>
    main()
  File "manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "S_v1\venv\lib\site-packages\django\core\management\__init__.py", line 442, in execute_from_command_line
    utility.execute()
  File "S_v1\venv\lib\site-packages\django\core\management\__init__.py", line 382, in execute
    settings.INSTALLED_APPS
  File "S_v1\venv\lib\site-packages\django\conf\__init__.py", line 102, in __getattr__
    self._setup(name)
  File "S_v1\venv\lib\site-packages\django\conf\__init__.py", line 89, in _setup
    self._wrapped = Settings(settings_module)
  File "S_v1\venv\lib\site-packages\django\conf\__init__.py", line 217, in __init__
    mod = importlib.import_module(self.SETTINGS_MODULE)
  File "C:\Users\P\AppData\Local\Programs\Python\Python38\lib\importlib\__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 848, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "S_v1\mysite_2\mysite\settings.py", line 102, in <module>
    DATABASES = {'default': dj_database_url.config(default=DATABASE_URL)}
  File "S_v1\venv\lib\site-packages\dj_database_url\__init__.py", line 72, in config
    return parse(
  File "S_v1\venv\lib\site-packages\dj_database_url\__init__.py", line 126, in parse
    raise ValueError(
ValueError: No support for 'neo4j+ssc'. We support: cockroach, mssql, mssqlms, mysql, mysql-connector, mysql2, mysqlgis, oracle, oraclegis, pgsql, postgis, postgres, postgresql, redshift, spatialite, sqlite, timescale, timescalegis

I don't want to use a local database that Django creates by default. Is there any way I can connect my Django app to a graph database in the cloud-hosted AuraDB?


Solution

  • This setting works for me which uses neo4j+s rather than neo4j+ssc.

    DATABASE_URL=neo4j+s://neo4j:<awesome_password>@<db_aura_svr>.databases.neo4j.io:7687
    

    Your setting uri = 'neo4j+ssc://xxxxxxxx.databases.neo4j.io' is using ssc which enables encryption with no certificate checks, typically for use with self-signed certificates. Please remove the protocol and use this instead:

    uri = 'xxxxxxxx.databases.neo4j.io:7687
    config.DATABASE_URL = 'neo4j+s://{}:{}@{}'.format(user, psw, uri)
    

    See my example below:

    (venv) josebacoy@users-MBP-2 paradise_papers_search % export DATABASE_URL=neo4j+s://neo4j:<awesome_password>@<db_aura_svr>.databases.neo4j.io:7687
    (venv) josebacoy@users-MBP-2 paradise_papers_search % python manage.py runserver --settings=paradise_papers_search.settings.dev
    
    Watching for file changes with StatReloader
    Performing system checks...
    
    System check identified no issues (0 silenced).
    March 26, 2024 - 15:44:03
    Django version 2.2.24, using settings 'paradise_papers_search.settings.dev'
    Starting development server at http://127.0.0.1:8000/
    Quit the server with CONTROL-C.
    [26/Mar/2024 15:44:22] "GET / HTTP/1.1" 200 14521
    [26/Mar/2024 15:44:22] "GET /fetch/jurisdictions HTTP/1.1" 200 39
    [26/Mar/2024 15:44:22] "GET /fetch/datasource HTTP/1.1" 200 39
    [26/Mar/2024 15:44:22] "GET /fetch/countries HTTP/1.1" 200 39
    [26/Mar/2024 15:44:25] "GET /fetch/count?t=Intermediary&q=&p=0 HTTP/1.1" 200 48
    [26/Mar/2024 15:44:25] "GET /fetch/count?t=Officer&q=&p=0 HTTP/1.1" 200 48
    [26/Mar/2024 15:44:25] "GET /fetch/count?t=Other&q=&p=0 HTTP/1.1" 200 48
    [26/Mar/2024 15:44:25] "GET /fetch/count?t=Entity&q=&p=0 HTTP/1.1" 200 48
    [26/Mar/2024 15:44:25] "GET /fetch/count?t=Address&q=&p=0 HTTP/1.1" 200 48
    [26/Mar/2024 15:44:25] "GET /fetch/nodes?t=Entity&q=&p=1 HTTP/1.1" 200 48