Haskell持久不同步

时间:2014-04-11 05:53:41

标签: postgresql yesod

我使用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重新同步?

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

我回答了我自己的问题,因为Digoal的解决方案并不完全正确,但他的主要想法是正确的,所以他应该得到业力。但真正的解决方案对于评论来说太大了。基本上,我的Persistent模式确实存在问题。正如Digoal所说,Postgres没有' date'功能。它确实有' current_date'。所以新的Persistent架构看起来像:

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