如何使用 grails 迁移增加 VARCHAR 大小
Posted
技术标签:
【中文标题】如何使用 grails 迁移增加 VARCHAR 大小【英文标题】:How to increase VARCHAR size using grails migration 【发布时间】:2015-02-06 02:21:35 【问题描述】:我使用 grails 迁移 (liquibase) 为表 DB_SERVER
添加了 2 个新列 SCOMMENT
和 SURL
databaseChangeLog =
changeSet(author: "syam (generated)", id: "changelog-2.3.6")
addColumn(tableName:"DB_SERVER")
column(name:"SCOMMENT", type:"VARCHAR2(255 CHAR)")
constraints(nullable: "true")
addColumn(tableName:"DB_SERVER")
column(name:"SURL", type:"VARCHAR2(255 CHAR)")
constraints(nullable: "true")
最初我将SCOMMENT
和SURL
定义为255 个字符长度。在下一个版本中,我正在尝试使用modifyColumn
将字符长度增加到 1024,如下所示
databaseChangeLog =
changeSet(author: "syam (generated)", id: "changelog-2.3.7")
// Increase maximum length of characters for scomment field in DbServer
modifyDataType(columnName:"SCOMMENT", tableName:"DB_SERVER", newDataType="VARCHAR2(1024 CHAR)")
//Increase the maximum length of characters for surl field in DbServer
modifyDataType(columnName:"SURL", tableName:"DB_SERVER", newDataType="VARCHAR2(1024 CHAR)")
当我尝试迁移时,出现以下错误
Error 2014-12-08 13:11:28,086 [localhost-startStop-1] ERROR context.GrailsContextLoader - Error initializing the application: liquibase.exception.ValidationFailedException: Validation Failed:
2 changes have validation failures
newDataType is required, changelog-2.3.7.groovy::changelog-2.3.7::syam(generated)::(Checksum: 3:04f74b0209f64ad261e4a864fcc3c43c)
Message: liquibase.exception.ValidationFailedException: Validation Failed:
2 changes have validation failures
newDataType is required, changelog-2.3.7.groovy::changelog-2.3.7::syam (generated)::(Checksum: 3:04f74b0209f64ad261e4a864fcc3c43c)
Line | Method
->> 262 | run in java.util.concurrent.FutureTask
SCOMMENT
和 SURL
的字符长度如何更改?
【问题讨论】:
这可能很接近,但您应该删除“CHAR”,对吗?不应该只是 VARCHAR2(1024) 吗?该消息似乎在说您没有指定类型,但这可能是因为它是一种意外的格式。当您在客户端手动执行此操作时,这是否有效? 尝试不使用“CHAR”并再次遇到相同的错误。我通常通过dbm-gorm-diff
生成changelog。 changelog-2.3.6(第一个块中的代码)是生成的确切代码。是的,手动修改客户端工作正常。
我正在使用 grails version 2.2.4 和 database-migration-1.3.2。是不是老版本的问题。
【参考方案1】:
该错误是 Liquibase 错误,而不是数据库错误。 Liquibase 没有看到 newDataType 属性,因此会引发验证错误,但您正在设置它。我可以使用标准的 liquibase 和 xml 或 json 运行类似的 changeSet,因此它可能是 grails DSL 的问题。可能值得向他们提出问题。
如果 grails 解析出现问题,您总是可以退回到“sql”命令,直接传递 ALTER TABLE 语句。
【讨论】:
【参考方案2】:我不得不这样做,复制了您的代码并得到了同样的错误。我发现您有一个错字:您必须在“newDataType=...”中将 '=' 替换为 ':'。然后,我对该修复没有错误。
【讨论】:
【参考方案3】:您发布的示例有错字。你有一个等号,你应该有一个冒号:
改变
modifyDataType(columnName:"SCOMMENT", tableName:"DB_SERVER", newDataType="VARCHAR2(1024 CHAR)")
到
modifyDataType(columnName:"SCOMMENT", tableName:"DB_SERVER", newDataType:"VARCHAR2(1024 CHAR)")
【讨论】:
【参考方案4】:根据您使用的数据库的数据库 sql 方言,更改集语法会有所不同。 使用 mysql GORM:
databaseChangeLog =
changeSet(author: "kujalpe (manual)", id: "1493972667393-1")
comment'BUG-1 Increase SCOMMENT column size in DB_SERVER table'
modifyDataType(tableName: "DB_SERVER", columnName: "SCOMMENT", newDataType: "varchar(1024)")
【讨论】:
以上是关于如何使用 grails 迁移增加 VARCHAR 大小的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Grails 2.1 迁移到 Grails 2.3 应用程序?
Grails 2.3 数据库迁移上的“加载插件管理器时出错:TomcatGrailsPlugin”