请注意这个答案与 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
要使上述工作正常进行,您需要在本地数据库和远程数据库之间建立一个链接服务器:
-- 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