自动生成自然键

Don*_*Don 7 django django-models natural-key

我正在研究一种方法来序列化数据库A中的部分数据并在数据库B中对其进行反序列化(在不同安装之间进行一种保存/恢复)并且我已经看过Django 自然键以避免由于重复ID导致的问题.

唯一的问题是我应该为我的所有模型添加自定义管理器和新方法.有没有办法让Django通过查看unique=Trueunique_togheter字段自动生成自然键?

Sim*_*hes 3

请注意,这个答案与 Django 无关,但希望为您提供另一种考虑的选择。

您没有提到您的数据库,但是,在 SQL Server 中,您可以使用BINARY_CHECKSUM()关键字为行中保存的数据提供唯一值。将其视为针对行中所有字段的哈希。此校验和方法可用于通过检查本地行校验和 <> 远程行校验和来从另一个数据库更新数据库。

下面的 SQL 将从远程数据库更新本地数据库。它不会插入新行,因为您使用insert ... where id > @MaxLocalID

SELECT  delivery_item_id, BINARY_CHECKSUM(*) AS bc
INTO    #DI
FROM    [REMOTE.NETWORK.LOCAL].YourDatabase.dbo.delivery_item di


SELECT  delivery_item_id, BINARY_CHECKSUM(*) AS bc
INTO    #DI_local
FROM    delivery_item di

-- Get rid of items that already match
DELETE  FROM #DI_local
WHERE   delivery_item_id IN (SELECT l.delivery_item_id
                             FROM   #DI x, #DI_local l
                             WHERE  l.delivery_item_id = x.delivery_item_id
                             AND l.bc = x.bc)

DROP TABLE #DI

UPDATE  DI
SET     engineer_id = X.engineer_id,
        ... -- Set other fields here
FROM    delivery_item DI,
        [REMOTE.NETWORK.LOCAL].YourDatabase.dbo.delivery_item x,
        #DI_local L
WHERE   x.delivery_item_id = L.delivery_item_id
        AND DI.delivery_item_id = L.delivery_item_id

DROP TABLE #DI_local
Run Code Online (Sandbox Code Playgroud)

为了使上述工作正常进行,您将需要本地数据库和远程数据库之间有一个链接服务器:

-- Create linked server if you don't have one already 
IF NOT EXISTS ( SELECT  srv.name
                FROM    sys.servers srv
                WHERE   srv.server_id != 0
                        AND srv.name = N'REMOTE.NETWORK.LOCAL' ) 
    BEGIN
        EXEC master.dbo.sp_addlinkedserver @server = N'REMOTE.NETWORK.LOCAL',
        @srvproduct = N'SQL Server'

        EXEC master.dbo.sp_addlinkedsrvlogin
        @rmtsrvname = N'REMOTE.NETWORK.LOCAL',
        @useself = N'False', @locallogin = NULL,
        @rmtuser = N'your user name',
        @rmtpassword = 'your password'
    END
GO
Run Code Online (Sandbox Code Playgroud)