如何从Django连接到Neo4J AuraDB(免费版)?
问题描述
我在settings.py中添加了如下配置:
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)}
运行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
我不想使用Django默认创建的本地数据库,请问有没有办法将我的Django应用连接到云端托管的AuraDB图数据库?
解决方案
Django原生不支持Neo4j(包括AuraDB)作为默认数据库,dj_database_url也未适配Neo4j协议,因此不能通过常规的DATABASES配置方式实现连接。可以通过以下步骤完成集成:
- 安装适配库
使用django-neomodel(基于neomodel开发的Django-Neo4j集成工具),执行安装命令:
pip install django-neomodel
- 调整settings.py配置
移除原配置中用dj_database_url设置DATABASES的代码,保留并优化neomodel相关配置:
from neomodel import config # AuraDB连接信息 NEO4J_USER = 'neo4j' NEO4J_PASSWORD = '你的AuraDB密码' NEO4J_BOLT_URL = 'neo4j+s://xxxxxxx.databases.neo4j.io' # 直接使用AuraDB控制台提供的Bolt URL # 配置neomodel连接 config.DATABASE_URL = f"neo4j+s://{NEO4J_USER}:{NEO4J_PASSWORD}@{NEO4J_BOLT_URL.split('://')[1]}" config.ENCRYPTED_CONNECTION = True # AuraDB强制要求加密连接,必须设为True # 将django_neomodel加入INSTALLED_APPS INSTALLED_APPS = [ # 原有应用 'django_neomodel', ]
注意:AuraDB的官方连接URL为neo4j+s://开头,无需使用neo4j+ssc。
- 定义图模型
放弃Django原生的models.Model,改用django_neomodel提供的DjangoNode定义图节点:
from django_neomodel import DjangoNode from neomodel import StringProperty, IntegerProperty class Person(DjangoNode): name = StringProperty(unique_index=True) age = IntegerProperty() class Meta: app_label = '你的应用名称'
- 数据操作
可直接使用neomodel的API进行CRUD,也支持Django风格的ORM操作:
# 创建节点 person = Person(name='Alice', age=30).save() # 查询节点 alice = Person.nodes.get(name='Alice') # 更新节点 alice.age = 31 alice.save() # 删除节点 alice.delete()
- 关键注意事项
- Django的
migrate命令不适用于Neo4j,图数据库无需传统表迁移,定义好节点模型即可直接使用。 - 若要在Django admin后台管理图模型,需注册
NeoModelAdmin:from django.contrib import admin from django_neomodel.admin import NeoModelAdmin from .models import Person admin.site.register(Person, NeoModelAdmin)
内容的提问来源于stack exchange,提问作者Ranjan
相关产品推荐
相关产品推荐

