English 中文(简体)
自动合并任意Django模式
原标题:Automatically merging arbitrary Django models

我有两个Django-ORM管理的数据库,我想合并。 两者都有非常相似的图象,而且两者都有标准用户表,还有几个相互参照的共享表,以及相对用户,我想自动并入一个数据库。

可理解的是,这可能非常不相称,取决于外国钥匙关系,而且每张表格中什么是“unique”记录。

是否有任何人知道是否有工具来完成这一合并行动?

如果目前不存在这样的情况,我正在考虑根据标准负荷数据指挥,撰写我自己的管理指挥部。 基本上,你利用标准丢弃数据指令从源数据库出口表格,然后使用经过修改的装货数据版本,将其“并入目的地数据库”。

例如,如果我有A和B数据库,而且我想将B数据库合并为A数据库,那么我就希望按照假冒编码采用一种程序:

merge_database_dst = A
merge_database_src = B
for table in sorted(merge_database_dst.get_redundant_tables(merge_database_src), key=acyclic_dependency):
    key = table.get_unique_column_key()
    src_id_to_dst_id = {}
    for record_src in merge_database_src.table.objects.all():
        src_key_value = record_src.get_key_value(key)
        try:
            record_dst = merge_database_dst.table.objects.get(key)
            dst_key_value = record_dst.get_key_value(key)
        except merge_database_dst.table.DoesNotExist:
            record_dst = merge_database_dst.table(**[(k,convert_fk(v)) for k,v in record_src._meta.fields])
            record_dst.save()
            dst_key_value = record_dst.get_key_value(key)
        src_id_to_dst_id[(table,record_src.id)] = record_dst.id

转换_fk()功能将利用电弧_id_to_dst_id指数将源表中的外国关键参考资料转换到目的地表中的同等身份识别资料。

总之,计算法将取代按抚养顺序合并的表格,父母先休。 因此,如果我们想合并桌子,以用户为依托,那么我们就会使[用户,我方言]变得.然。

每个合并的表格都需要某种指标,记录显示普遍独特记录的栏目组合(即“钥匙”)。 用户可以是“用户名称”和(或)“电子邮件”栏。

如果A数据库B中的关键价值已经存在,则记录不是从B进口,而是记录A中现有记录的识别。

如果A数据库B中的关键值不存在,则该记录从B进口,新记录的索引则记录在案。

利用先前记录的识别资料,绘制了地图,解释如何将外国对B中具体记录的提法与A中新的合并/现有记录进行测绘。 如果未来的记录并入A,则这一绘图将用来转换外国钥匙。

我仍然可以设想一些情况,即进口记录提到一个没有列入倾销数据表格的表格,这可能导致整个进口失败,因此,需要某种“dryrun”办法模拟进口,以确保能够翻译所有FK参考资料。

这似乎是一种实际做法吗? 是否有更好的办法?

EDIT:这确实是我所期望的,但我认为其他人可能认为是有意义的。 Turbion Project有一个机制,可以在同一个数据库内复制不同Django模型的对应记录。 它通过确定翻译层(即合并)。 模型Layer在两个Django模型之间表示,如果你更新“www” field inuser s Profile,则自动更新用户中的“url”领域

功能I m 望是一种比喻的不同之处,因为我想将整个(或部分)数据库按不定期的间隔进行,即负荷数据管理指挥的类型。

问题回答

Wow。 不管怎样,这都是复杂的工作。 尽管如此:

如果我正确理解你的项目需要,那么,可以通过在南南进行数据迁移。 即便如此,如果我说这将是一个 j子的话,我就lying。

我的建议是——这多半是你所提问题的假设,但我要表明——你有一个“主人”的表格,这个表格是基数,它有另一个表格的记录。 因此,表A保留了所有现有记录,只从B中获取增补资料,然后将B删除。

我犹豫不决,因为你的实际工作将比这更加复杂,但我一定要努力,把你引向正确的方向。 ......

import datetime
from south.db import db
from south.v2 import DataMigration
from django.db import models

class Migration(DataMigration):
    def forwards(self, orm):
        for b in orm.B.objects.all():
            # sanity check: does this item get copied into A at all?
            if orm.A.objects.filter(username=b.username):
                continue

            # make an A record with the properties of my B record
            a = orm.A(
                first_name=b.first_name,
                last_name=b.last_name,
                email_address=b.email_address,
                [...]
            )

            # save the new A record, and delete the B record
            a.save()
            b.delete()

    def backwards(self, orm):
        # backwards method, if you write one

这将最终将所有不在A类的B迁至A,并留给你一张预计重复的Bs表,然后由你以其他方式加以核对,然后删除。

Like I said, this sample isn t meant to be complete. If you decide to go this route, spend time in the South documentation, and particularly make sure you look at data migrations.

这是我的两点。 希望会有所助益。





相关问题
Can Django models use MySQL functions?

Is there a way to force Django models to pass a field to a MySQL function every time the model data is read or loaded? To clarify what I mean in SQL, I want the Django model to produce something like ...

An enterprise scheduler for python (like quartz)

I am looking for an enterprise tasks scheduler for python, like quartz is for Java. Requirements: Persistent: if the process restarts or the machine restarts, then all the jobs must stay there and ...

How to remove unique, then duplicate dictionaries in a list?

Given the following list that contains some duplicate and some unique dictionaries, what is the best method to remove unique dictionaries first, then reduce the duplicate dictionaries to single ...

What is suggested seed value to use with random.seed()?

Simple enough question: I m using python random module to generate random integers. I want to know what is the suggested value to use with the random.seed() function? Currently I am letting this ...

How can I make the PyDev editor selectively ignore errors?

I m using PyDev under Eclipse to write some Jython code. I ve got numerous instances where I need to do something like this: import com.work.project.component.client.Interface.ISubInterface as ...

How do I profile `paster serve` s startup time?

Python s paster serve app.ini is taking longer than I would like to be ready for the first request. I know how to profile requests with middleware, but how do I profile the initialization time? I ...

Pragmatically adding give-aways/freebies to an online store

Our business currently has an online store and recently we ve been offering free specials to our customers. Right now, we simply display the special and give the buyer a notice stating we will add the ...

Converting Dictionary to List? [duplicate]

I m trying to convert a Python dictionary into a Python list, in order to perform some calculations. #My dictionary dict = {} dict[ Capital ]="London" dict[ Food ]="Fish&Chips" dict[ 2012 ]="...

热门标签