1

ユーザーというエンティティがあります

User
  ident Text
  ...
  status Status Default=Claimed

ステータスは私が作ったデータ型です。Postgresql テーブルに既に行があるため、コンパイルしようとすると yesod devel migration エラーが発生します

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 ですが、Clailed 列が存在しないというエラーが表示されます。テキストでも数値でもないデフォルト値を持つ列を追加するにはどうすればよいですか?

4

2 に答える 2

1

さて、あなたの変更クエリは、新しい列の型が varchar であるため、デフォルト値は varchar (String) になると言っています。

ALTER TABLE "user" ADD COLUMN "status" VARCHAR NOT NULL DEFAULT 'Claimed'
于 2013-11-01T12:24:42.087 に答える
0

私は自分で問題を解決しました。PostgreSql エラーでした。Claimed は、次のように一重引用符で囲む必要がありました。

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

PG では、一重引用符は文字列定数用であり、二重引用符は大文字と小文字を区別する識別子を指定します。この場合、Claimed unquoted は識別子と見なされるため、列 <...> が存在しないというエラーが発生しました。 ここに PostgresSql のドキュメントがあります。

于 2013-11-01T12:32:10.503 に答える