Haskell Persistent如何向sql数据库的现有表中添加字段

Haskell Persistent如何向sql数据库的现有表中添加字段,sql,haskell,persistent,Sql,Haskell,Persistent,给定以下持久数据库定义: share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase| Mount name String UniqueName name desc String deriving Show FaceSlope slope Double mountId MountId MountIdForFaceSlope mountId deriving Show Fac

给定以下持久数据库定义:

share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
Mount
   name String
   UniqueName name
   desc String
  deriving Show

FaceSlope
  slope Double
  mountId MountId
  MountIdForFaceSlope mountId
 deriving Show

FaceDimensions
  zTop Double
  zBtm Double
  zHeight Double default=5.0
  leftx Double
  lefty Double
  rightx Double
  righty Double
  mountId MountId
  MountIdForFaceDimensions mountId
 deriving Show

CurrentMount
  mountId MountId
 deriving Show
|]
share
 [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
  WristDimensions
   name String
   UniqueWristDimensionName name
   desc String
   squaredOffRiserHeight Double 
   radius Double 
   power Double  
  deriving Show
  |]                                                                                                              
我需要将
zHeight
添加到
FaceDimensions
表中。我为数据库中已经存在的任何行提供了一个默认值

share
 [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
  WristDimensions
   name String
   UniqueWristDimensionName name
   desc String
   squaredOffRiserHeight Double 
   radius Double 
   power Double  
  deriving Show
  |]                                                                                                              
当我运行migration migrateAll时,我得到以下错误

share
 [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
  WristDimensions
   name String
   UniqueWristDimensionName name
   desc String
   squaredOffRiserHeight Double 
   radius Double 
   power Double  
  deriving Show
  |]                                                                                                              
Migrating: CREATE TEMP TABLE 
"wrist_dimensions_backup"("id" INTEGER    PRIMARY KEY,"name" 
 VARCHAR NOT NULL,"desc" VARCHAR NOT  NULL,
 "squared_off_riser_height" REAL NOT NULL,
 "radius" REAL NOT NULL,"power" REAL NOT NULL,"new_field" REAL NOT    
 NULL,CONSTRAINT "unique_wrist_dimension_name" UNIQUE ("name"))
 Migrating: INSERT INTO "wrist_dimensions_backup"   
 ("id","name","desc","squared_off_riser_height","radius","power") SELECT 
 "id","name","desc","squared_off_riser_height","radius","power" FROM  
 "wrist_dimensions"
  ChampCad-exe: SQLite3 returned ErrorConstraint while attempting to perform step.
PersistMarshalError“字段:应为双精度,已收到: 持续文本“z_高度”

share
 [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
  WristDimensions
   name String
   UniqueWristDimensionName name
   desc String
   squaredOffRiserHeight Double 
   radius Double 
   power Double  
  deriving Show
  |]                                                                                                              
为了使其正常工作,我必须手动将该字段添加到sqlite数据库中。 有没有一种方法可以让我直接通过Persistent来做到这一点?

Alec:

share
 [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
  WristDimensions
   name String
   UniqueWristDimensionName name
   desc String
   squaredOffRiserHeight Double 
   radius Double 
   power Double  
  deriving Show
  |]                                                                                                              
不,如果没有默认设置,它将无法工作。问题在于添加一个新字段,其中存在不包含新字段任何值的现有行。这就是为什么我尝试使用默认值,以查看在插入新字段(列)时预先存在的行是否会获得默认值。我在这里重复了一个类似的错误

share
 [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
  WristDimensions
   name String
   UniqueWristDimensionName name
   desc String
   squaredOffRiserHeight Double 
   radius Double 
   power Double  
  deriving Show
  |]                                                                                                              
现在我添加了一些数据来填充一行,这样表中就有了预先存在的数据。然后尝试添加一个新字段(newfielddouble)

share
 [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
  WristDimensions
   name String
   UniqueWristDimensionName name
   desc String
   squaredOffRiserHeight Double 
   radius Double 
   power Double  
  deriving Show
  |]                                                                                                              
现在,当我运行迁移时: 给出以下错误

share
 [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
  WristDimensions
   name String
   UniqueWristDimensionName name
   desc String
   squaredOffRiserHeight Double 
   radius Double 
   power Double  
  deriving Show
  |]                                                                                                              
Migrating: CREATE TEMP TABLE 
"wrist_dimensions_backup"("id" INTEGER    PRIMARY KEY,"name" 
 VARCHAR NOT NULL,"desc" VARCHAR NOT  NULL,
 "squared_off_riser_height" REAL NOT NULL,
 "radius" REAL NOT NULL,"power" REAL NOT NULL,"new_field" REAL NOT    
 NULL,CONSTRAINT "unique_wrist_dimension_name" UNIQUE ("name"))
 Migrating: INSERT INTO "wrist_dimensions_backup"   
 ("id","name","desc","squared_off_riser_height","radius","power") SELECT 
 "id","name","desc","squared_off_riser_height","radius","power" FROM  
 "wrist_dimensions"
  ChampCad-exe: SQLite3 returned ErrorConstraint while attempting to perform step.

可能不是:runMigration migrateAll有一种更新方法可以绕过此约束。

在没有默认值=5.0位的情况下是否可以工作?此错误通常意味着您有一个已经存在的列的值错误。您能否发布
SHOW CREATE TABLE face_维度的输出?我将在另一个表上重现错误。
share
 [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
  WristDimensions
   name String
   UniqueWristDimensionName name
   desc String
   squaredOffRiserHeight Double 
   radius Double 
   power Double  
  deriving Show
  |]