我正在尝试使用Grails Database Migration Plugin作为参考来熟悉this site。尝试添加非空约束的属性时遇到问题。我以与网站上显示的相同的方式对脚本进行建模(添加列,为现有记录设置默认值,然后向列添加不可为空的约束):
databaseChangeLog = {
changeSet(author: "Ryan (generated)", id: "1340893788251-1") {
addColumn(tableName: "game") {
column(name: "genre", type: "varchar(255)")
}
grailsChange{
change{
sql.executeUpdate("UPDATE game SET genre = 'Other'")
}
}
addNotNullConstraint(tableName: "game", columnName: "genre")
}
}
当我尝试更新我的数据库时,它会无声地失败。因此,我将这三个更改分成三个不同的groovy脚本来跟踪问题。
第一个文件(添加列)工作正常:
databaseChangeLog = {
changeSet(author: "Ryan (generated)", id: "1340893788251-1") {
addColumn(tableName: "game") {
column(name: "genre", type: "varchar(255)")
}
}
}
第二个文件(为现有记录指定默认值)工作正常:
databaseChangeLog = {
changeSet(author: "Ryan (generated)", id: "defaultValue") {
grailsChange{
change{
sql.executeUpdate("UPDATE game SET genre = 'Other'")
}
}
}
}
第三个文件(添加非空约束)无声地失败:
databaseChangeLog = {
changeSet(author: "Ryan (generated)", id: "notNull") {
addNotNullConstraint(tableName: "game", columnName: "genre")
}
}
日志文件仅显示与插件相关的内容:
2012-06-28 10:17:11,694 [main] INFO liquibase - 成功获得更改日志锁定
2012-06-28 10:17:11,972 [主要] INFO liquibase - 读自DATABASECHANGELOG
2012-06-28 10:17:11,980 [主要] INFO liquibase - 从DATABASECHANGELOG
读取 2012-06-28 10:17:12,009 [主要] INFO liquibase - 成功发布更改日志锁
如果我检查databasechangelog表,我可以看到该脚本尚未执行。控制台给了我这个:
|启动数据库root @ jdbc的dbm-update:mysql:// localhost / migration
但没有
就像我看到成功的更新一样。|完成了dbm-update
注意:请注意,我用作参考的网站使用的是1.0版本,我使用的是版本1.1。我很难找到这个插件的教程或示例,更难找到最新版本的信息(一个月前发布)。
任何人都可以确定我在哪里出错了吗?
答案 0 :(得分:4)
午餐时我正在思考这个问题,并想知道为什么我没有采取明显的调试步骤。 groovy脚本更改是从头开始的。添加列的更新工作正常,这意味着我的数据库和我的域对象之间的唯一区别是不可为空的约束:
class Game {
String genre
static constraints = {
genre(nullable: false, blank: false)
}
}
...为什么不运行grails dbm-gorm-diff
并查看插件的内容?
结果如下:
databaseChangeLog = {
changeSet(author: "Ryan (generated)", id: "1340897310305-1") {
addNotNullConstraint(columnDataType: "varchar(255)", columnName: "genre", tableName: "game")
}
}
我创建的更改脚本与插件制作的脚本之间的唯一区别是:
columnDataType:“varchar(255)”
我添加到我制作的脚本(只是为了确保我没有做任何其他错误)和宾果游戏,更新工作。