Обратите внимание, что этот ответ не имеет ничего общего с Джанго, но, надеюсь, даст вам еще одну альтернативу.
Вы не упомянули свою базу данных, однако в 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