python - 如何跨 SQL Server 和 Postgres 比较两个表列哈希的哈希值?

标签 python sql-server database postgresql hash

我在 SQL Server 2017 中有一个表,其中有很多行,该表已与数据一起迁移到 Postgres 10.5(我的同事使用 Talend 完成了它工具)。

我想比较迁移后数据是否正确。我想比较 SQL ServerPostgres 中列中的值。

我可以尝试将列读入 SQL serverPostgresNumpy 系列 项中,然后比较两者。

但是这两个数据库都不在我的本地机器上。它们托管在我需要从网络访问的服务器上,这意味着数据检索将花费很多时间。

相反,我想做这样的事情。

对按 primary_key 排序的列值执行 sha256md5 哈希并比较来自两个数据库的哈希值,这意味着我不不需要从数据库中检索结果到我的本地进行比较。

如果列具有完全相同的值,则该函数或其他东西应该为 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/

相关文章:

python - 如何使用多个保存的模型进行预测?

c# - 哪种 sql server 数据类型最能代表 C# 中的 double ?

sql - 有没有办法找到哪些帐户可以执行xp_cmdshell?

mysql - 对于包含 null、0 或 1 的 mysql 列,我应该使用什么数据类型?

php - 如何使用代码点火器框架在查询 php 中将动态对象转换为数组

Python继承: create child object in parent class

python - 我的美丽汤刮刀无法按预期工作

python - 为什么 pip-tools 无法推断正确的版本?

sql-server - MOSS SSP 问题 - 从已删除的 SSP 登录数据库失败

javascript - 将嵌套整数数组转换为平面整数数组 - javascript