gpt4 book ai didi

database - 在两个django服务器之间同步数据

转载 作者:搜寻专家 更新时间:2023-10-30 19:48:40 25 4
gpt4 key购买 nike

我有一个中央 Django 服务器,其中包含我在数据库中的所有信息。我想要第二个 Django 服务器,它在第二个数据库中包含该信息的一个子集。我需要一种可靠的方法来有选择地在两者之间同步数据。

  • 辅助 Django 需要在特定时间从主 Django 中提取其数据子集。该子集必须按某些字段进行过滤。
  • 辅助 Django 必须偶尔将其数据推送到主 Django。
  • 理想情况下,双向同步会为每个模型保留最近修改的对象。

我在考虑使用 TimeStampedModel(来自 django-extensions)或添加我自己的 DateTimeField(auto_now=True) 这样每个对象都存储其最后修改时间。然后,也许是一种从一个数据库转储数据并将其加载到另一个数据库的机制,以便只保留最近修改的对象。

我正在考虑的可能性是 django 的 dumpdata、django-extensions dumpscript、django-test-utils makefixture 或者 django-fixture magic。有很多事情要考虑,所以我不确定该走哪条路。

最佳答案

这是我的解决方案,它符合我的所有要求:

  1. 实现 natural keys以及对所有模型的独特约束
    • 允许在不使用主键 ID 的情况下以独特的方式引用每个对象
  2. 子类来自 TimeStampedModel 的每个模型在 django 扩展中
    • 添加自动更新的createdmodified 字段
  3. 创建用于导出的 Django 管理命令,该命令过滤数据子集并使用自然键将其序列化

    baz = Baz.objects.filter(foo=bar)
    yaz = Yaz.objects.filter(foo=bar)

    objects = [baz, yaz]
    flat_objects = list(itertools.chain.from_iterable(objects))

    data = serializers.serialize("json", flat_objects, indent=3, use_natural_keys=True)
    print(data)
  4. 创建导入的Django管理命令,读取序列化文件并遍历对象如下:

    • 如果数据库中不存在该对象(通过自然键),则创建它
    • 如果对象存在,检查修改时间戳
    • 如果导入的对象较新,则更新字段
    • 如果导入的对象较旧,则不更新(但打印警告)

代码示例:

# Open the file
with open(args[0]) as data_file:
json_str = data_file.read()

# Deserialize and iterate
for obj in serializers.deserialize("json", json_str, indent=3, use_natural_keys=True):

# Get model info
model_class = obj.object.__class__
natural_key = obj.object.natural_key()
manager = model_class._default_manager

# Delete PK value
obj.object.pk = None

try:
# Get the existing object
existing_obj = model_class.objects.get_by_natural_key(*natural_key)

# Check the timestamps
date_existing = existing_obj.modified
date_imported = obj.object.modified
if date_imported > date_existing:

# Update fields
for field in obj.object._meta.fields:
if field.editable and not field.primary_key:
imported_val = getattr(obj.object, field.name)
existing_val = getattr(existing_obj, field.name)
if existing_val != imported_val:
setattr(existing_obj, field.name, imported_val)

except ObjectDoesNotExist:
obj.save()

此工作流程是首先调用 python manage.py exportTool > data.json,然后在另一个 django 实例(或相同实例)上调用 python manage.py importTool data。 json.

关于database - 在两个django服务器之间同步数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17371380/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com