Yesod 迁移自定义数据类型

Posted

技术标签:

【中文标题】Yesod 迁移自定义数据类型【英文标题】:Yesod migrating custom data types 【发布时间】:2013-11-01 12:20:42 【问题描述】:

我有一个名为 User 的实体

User
  ident Text
  ...
  status Status Default=Claimed

状态是我制作的一种数据类型。我的 Postgresql 表中已有行,因此在尝试编译时出现 yesod devel 迁移错误

Migrating: ALTER TABLE "user" ADD COLUMN "status" VARCHAR NOT NULL
31/Oct/2013:07:17:19 -0500 [Debug#SQL] "ALTER TABLE \"user\" ADD COLUMN \"status\" VARCHAR NOT NULL" [] @(persistent-1.2.2.0:Database.Persist.Sql.Raw     ./Database/Persist/Sql/Raw.hs:37:5)
devel.hs: SqlError sqlState = "23502", sqlExecStatus = FatalError, sqlErrorMsg = "column \"status\" contains null values", sqlErrorDetail = "", sqlErrorHint = ""

这是意料之中的,我知道现在我应该去 psql 并自己进行迁移。 我认为迁移代码应该如下所示: ALTER TABLE "user" ADD COLUMN "status" VARCHAR NOT NULL DEFAULT Claimed 但我收到一条错误消息,提示列 Claimed 不存在。如何添加默认值不是文本或数字的列?

【问题讨论】:

【参考方案1】:

好吧,您的 alter 查询表明新的列类型是 varchar,因此默认值将是 varchar(字符串)。

ALTER TABLE "user" ADD COLUMN "status" VARCHAR NOT NULL DEFAULT 'Claimed'

【讨论】:

没错,只是我记得在双引号中我也遇到了错误。在 PG Sting 中,值是单引号的。【参考方案2】:

我自己解决了这个问题。这只是一个 PostgreSql 错误。声称确实是这样单引号的:

ALTER TABLE "user" ADD COLUMN "status" VARCHAR NOT NULL DEFAULT 'Claimed'

在 PG 中,单引号用于字符串常量,而双引号指定区分大小写的标识符。在这种情况下,Claimed unquoted 被认为是一个标识符,这就是为什么我得到一个列 <...> 不存在错误。 Here is the PostgresSql documentation.

【讨论】:

以上是关于Yesod 迁移自定义数据类型的主要内容,如果未能解决你的问题,请参考以下文章

ElasticSearch03_Mapping字段映射常用类型数据迁移ik分词器自定义分词器

ElasticSearch03_Mapping字段映射常用类型数据迁移ik分词器自定义分词器

商城项目18_esMapping字段映射常用类型数据迁移ik分词器自定义分词器

商城项目18_esMapping字段映射常用类型数据迁移ik分词器自定义分词器

ElasticSearch03_Mapping字段映射常用类型数据迁移ik分词器自定义分词器

Yesod 持久代码的类型类约束