【问题标题】:Haskell Persistent out of syncHaskell 持久不同步
【发布时间】:2014-04-11 23:58:02
【问题描述】:

我正在使用 Yesod 和 Persistent 创建博客(真的是原创,嗯?)。

在某个时候,我改变了我的模型,Persistent 说我尝试做的事情是不安全的,我必须手动完成。它说:

Database migration: manual intervention required.
The following actions are considered unsafe:

    ALTER TABLE "article" DROP COLUMN "date";

所以我继续在 Postgres 中运行它。事实上,我已经继续删除了“文章”表,我得到了错误:

Migrating: CREATe TABLE "article" 
      ( "id" SERIAL PRIMARY KEY UNIQUE,
        "title" VARCHAR NOT NULL,
        "author" VARCHAR NOT NULL,
        "day" DATE NOT NULL DEFAULT DATE,
        "content" VARCHAR NOT NULL)

devel.hs: SqlError { sqlState = "42703"
                   , sqlExecStatus = FatalError
                   , sqlErrorMsg = "column \"date\" does not exist"
                   , sqlErrorDetail = ""
                   , sqlErrorHint = ""
                   }

这是架构当前的外观(使用 Persistent 定义):

-- Blog Article
Article
  title   Text
  author  Text
  day     Day default=DATE
  content MathJax 

这里发生了什么?我必须做些什么才能让 Postgres 和 Persistent 重新同步?

【问题讨论】:

    标签: postgresql yesod


    【解决方案1】:

    请将您的创建表代码更改为:

        digoal=# CREATE TABLE "article" 
          ( "id" SERIAL PRIMARY KEY UNIQUE,
            "title" VARCHAR NOT NULL,
            "author" VARCHAR NOT NULL,
            "day" DATE NOT NULL DEFAULT current_date,
            "content" VARCHAR NOT NULL);
        CREATE TABLE
    

    PostgreSQL没有DATA函数,所以可以用current_date代替。

    【讨论】:

      【解决方案2】:

      我正在回答我自己的问题,因为 digoal 的解决方案并不完全正确,但他的主要思想是正确的,所以他应该受到因果报应。但真正的解决方案太大了,无法评论。基本上,我的持久模式确实有问题。正如 digal 所说,Postgres 没有“日期”功能。它确实有'current_date'。所以新的持久模式看起来像:

      -- Blog Article
      Article
        title   Text
        author  Text
        day     Day default=CURRENT_DATE
        content MathJax
      

      【讨论】:

        猜你喜欢
        • 2014-07-13
        • 1970-01-01
        • 1970-01-01
        • 2018-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-07
        • 1970-01-01
        相关资源
        最近更新 更多