我在 SQL Server 2017 中有一个表,其中有很多行,该表已与数据一起迁移到 Postgres 10.5(我的同事使用 Talend 完成了它工具)。
我想比较迁移后数据是否正确。我想比较 SQL Server 与 Postgres 中列中的值。
我可以尝试将列读入 SQL server 和 Postgres 的 Numpy 系列 项中,然后比较两者。
但是这两个数据库都不在我的本地机器上。它们托管在我需要从网络访问的服务器上,这意味着数据检索将花费很多时间。
相反,我想做这样的事情。
对按 primary_key 排序的列值执行 sha256 或 md5 哈希并比较来自两个数据库的哈希值,这意味着我不不需要从数据库中检索结果到我的本地进行比较。
如果列具有完全相同的值,则该函数或其他东西应该为 hash 返回相同的值。
我什至不确定这是否可行,或者是否有更好的方法。
谁能给我指明方向。
最佳答案
如果 FDW 不适合您,也许哈希比较是个好主意。 MD5 可能是个好主意,只是因为您应该从不同的软件中获得一致的结果。
显然,您需要列在两个数据库中的顺序相同才能进行散列比较。如果布局不同,您可以在 Postgres 中创建一个 View 以匹配 SQL Server 中的列顺序。
一旦您有了要比较的表/ View ,就可以在 Postgres 端找到散列的快捷方式。想象一个名为 facility
的表:
SELECT MD5(facility::text) FROM facility;
如果这不是很明显,这就是那里发生的事情。 Postgres 能够将任何 复合类型转换为文本。喜欢:
从 your_table_here 中选择 your_table_here::text
结果就像这个例子:
(2be4026d-be29-aa4a-a536-de1d7124d92d,2200d1da-73e7-419c-9e4c-efe020834e6f,"Powder Blue",Central,f)
注意结果周围的(括号)。在 SQL Server 端生成哈希时,您需要考虑到这一点。这段简洁的代码去掉了括号:
SELECT MD5(substring(facility::text, 2, length(facility::text))) FROM facility;
或者,您可以手动将列连接为字符串,然后对其进行哈希处理。如果您有在导入过程中自动更改的 ID 或时间戳字段,您很可能需要这样做或使用 View 。
::
转换运算符还可以将一行转换为另一种类型,前提是您已经进行了适当的转换。在上面列出的表格中,您也可以使用 View 。
在 SQL Server 方面,我一无所知。 HASHBYTES
?
关于python - 如何跨 SQL Server 和 Postgres 比较两个表列哈希的哈希值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58709171/