Don*_*Don 7 django django-models natural-key
我正在研究一种方法来序列化数据库A中的部分数据并在数据库B中对其进行反序列化(在不同安装之间进行一种保存/恢复)并且我已经看过Django 自然键以避免由于重复ID导致的问题.
唯一的问题是我应该为我的所有模型添加自定义管理器和新方法.有没有办法让Django通过查看unique=True或unique_togheter字段自动生成自然键?
请注意,这个答案与 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)
| 归档时间: |
|
| 查看次数: |
879 次 |
| 最近记录: |