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
|]