微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在使用 Django-admin 时实时同步 postgres 数据库与 neo4j?

如何解决如何在使用 Django-admin 时实时同步 postgres 数据库与 neo4j?

所以目前我正在处理一个 Django 项目,我有两个不同的数据库一个是 Postgresql,第二个是 Neo4j。我想要的是两个数据库间的实时同步。我正在使用 Django-admin 面板在 Postgres 数据库中进行 crud 操作。现在我还希望neo4j 数据库中的每个crud 操作更新。但我不知道该怎么做。

解决方法

您可以选择几条路线。我认为您将希望将 Postgres 作为您的主要 Django 数据库并使用 Neo4j 作为辅助 DB,而不是由 Django 框架管理。您可以使用类似于 this post 的 Neo4j 客户端库来实现这一点,用于自己与图形数据库交互。

为了使 Neo4j 与 Django 管理的 Postgres 保持同步,我认为 signals 将成为您最好的朋友,特别是 post_save 信号。本质上,任何时候您保存 Django 模型时,该信号都会触发一个函数,您可以编写该函数以使用 Neo4j 客户端 API 来反映图形数据库中的更改。

但是,根据您的模型的复杂程度,在此处确定哪些字段已更改为仅更新这些字段可能会变得棘手。不久前我遇到了类似的问题,并使用了这个自定义 Mixin(我找不到原作者,但将其保留在我的笔记中):

from django.forms import model_to_dict
import logging

logger = logging.getLogger(__name__)


class ModelDiffMixin(object):
    """
    A model mixin that tracks model fields' values and provide some useful api
    to know what fields have been changed.
    """

    def __init__(self,*args,**kwargs):
        super(ModelDiffMixin,self).__init__(*args,**kwargs)
        self.__initial = self._dict

    @property
    def diff(self):
        d1 = self.__initial
        d2 = self._dict
        diffs = [(k,(v,d2[k])) for k,v in d1.items() if v != d2[k]]
        return dict(diffs)

    @property
    def has_changed(self):
        return bool(self.diff)

    @property
    def changed_fields(self):
        return self.diff.keys()

    def get_field_diff(self,field_name):
        """
        Returns a diff for field if it's changed and None otherwise.
        """
        return self.diff.get(field_name,None)

    def save(self,**kwargs):
        """
        Saves model and set initial state.
        """
        super(ModelDiffMixin,self).save(*args,**kwargs)
        self.__initial = self._dict

    @property
    def _dict(self):
        return model_to_dict(self,fields=[field.name for field in
                             self._meta.fields])


如果你在你的模型中实现了这个 Mixin 以与 Neo4j 同步,那么在 post_save 信号处理程序中你可以调用 model.diffmodel.changed_fields 来查看哪些属性需要更新在 Neo4j 节点上,而不是删除整个节点并重新创建它和所有关系。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。