从 SQL Server 迁移到 Aurora PostgreSQL,遇到 GUID、VARCHAR、UUID 问题

问题描述

我正在寻求一些建议。

我已使用 AWS DMS 将数据库sql Server 迁移到 aurora Postgresql。在 sql Server 中的大多数表中,主键是 uniqueidentifier (GUID)。当迁移到 Postgres 时,这些列将转换为 VARCHAR(36)。根据 AWS DMS 文档,这似乎符合预期。

在我们的 .NET 应用程序中,我们使用 Entity Framework 6,我添加一个新的 dbContext 来使用 npgsql 提供程序。请注意,我们仍然保留现有的 sql Server EF6 提供程序。本质上,该应用程序将同时使用 sql Server 和 Postgresql。这一切都很好。

我遇到一些问题的地方是,当我的 Postgres 上下文对 Postgresql 数据库进行提取时,它遇到了很多错误

Npgsql.PostgresException: 42883: 运算符不存在:字符变化 = uuid

我了解这个问题,即使用 EF 的应用程序通过 Id (GUID) 进行提取,而 Postgres 表的 Id 为 VARCHAR 类型...

我的感觉是问题不在于应用程序或 EF 端,而是表上的列应该类似于 UUID。我可以做什么,在迁移后,我可以简单地将列更改为 UUID 类型,但这是方法吗,它会解决我的问题吗?我也觉得这不可能是我正在处理的一个独特案例;对于将 .NET 应用程序从 sql Server 迁移到 Postgresql 的任何人来说,这似乎都是一个常见问题...

我期待听到您对此的一些想法、评论和想法。提前致谢。

解决方法

这个迁移过程似乎不太适合这项任务,因为 GUID(这是 Microsoft 对 UUID 的混淆术语)应该迁移到 uuid。您不仅可以为每行节省 21 字节的存储空间,而且您也不会有这个问题。

您的应用程序似乎正在将 uuid 值与迁移的 varchar 之一进行比较:

WHERE uniqueidentifier = UUID '87595807-3157-4a81-ac89-3e09e83c0c0a'

您必须添加显式转换,如错误消息所述:

WHERE uniqueidentifier = CAST (UUID '87595807-3157-4a81-ac89-3e09e83c0c0a' AS text)

您将转换为 text,而不是 varchar,因为 varchar 没有相等运算符。比较时,varchar 被强制为 text,因为这些类型的存储是相同的。