grails数据库迁移"未找到列"错误

时间:2015-12-01 19:40:38

标签: grails database-migration

我正在使用grails数据库迁移插件:runtime ':database-migration:1.4.1'。对于最初的更改日志,一切似乎都有效,甚至从H2开发数据库到mysql。

但是,我想测试一个实际的模型更改,并且我得到了一个我无法弄清楚的错误。

我们有以下用户模型:

class User {

    // spring security params:
    transient springSecurityService

    String username
    String password

    // Added this to test model changes: 
    String removeme

    ...

    static mapping = {
        password column: '`password`'
    }
}

当我去生成差异时,即

grails dbm-gorm-diff --add change_test.groovy

我得到以下异常:

liquibase.exception.DatabaseException: org.h2.jdbc.JdbcSQLException: Column "PASSWORD" not found; SQL statement:
SELECT password FROM user WHERE 1 = 0 [42122-176]
    at liquibase.snapshot.jvm.JdbcDatabaseSnapshotGenerator.createSnapshot(JdbcDatabaseSnapshotGenerator.java:251)
    at liquibase.snapshot.DatabaseSnapshotGeneratorFactory.createSnapshot(DatabaseSnapshotGeneratorFactory.java:69)
    at liquibase.diff.Diff.compare(Diff.java:71)
    at grails.plugin.databasemigration.GormDiff.compare(GormDiff.groovy:45)
    at grails.plugin.databasemigration.ScriptUtils.createAndPrintFixedDiff(ScriptUtils.groovy:244)
    at DbmGormDiff$_run_closure1$_closure2$_closure3.doCall(DbmGormDiff:53)
    at grails.plugin.databasemigration.MigrationUtils.executeInSession(MigrationUtils.groovy:137)
    at DbmGormDiff$_run_closure1$_closure2.doCall(DbmGormDiff:50)
    at grails.plugin.databasemigration.ScriptUtils.executeAndWrite(ScriptUtils.groovy:104)
    at DbmGormDiff$_run_closure1.doCall(DbmGormDiff:49)
Caused by: org.h2.jdbc.JdbcSQLException: Column "PASSWORD" not found; SQL statement:
SELECT password FROM user WHERE 1 = 0 [42122-176]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:344)
    at org.h2.message.DbException.get(DbException.java:178)
    at org.h2.message.DbException.get(DbException.java:154)
    at org.h2.expression.ExpressionColumn.optimize(ExpressionColumn.java:148)
    at org.h2.command.dml.Select.prepare(Select.java:831)
    at org.h2.command.Parser.prepareCommand(Parser.java:248)
    at org.h2.engine.Session.prepareLocal(Session.java:442)
    at org.h2.engine.Session.prepareCommand(Session.java:384)
    at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1188)
    at org.h2.jdbc.JdbcStatement.executeQuery(JdbcStatement.java:75)
    at liquibase.snapshot.jvm.JdbcDatabaseSnapshotGenerator.isColumnAutoIncrement(JdbcDatabaseSnapshotGenerator.java:842)
    at liquibase.snapshot.jvm.JdbcDatabaseSnapshotGenerator.readColumns(JdbcDatabaseSnapshotGenerator.java:369)
    at liquibase.snapshot.jvm.JdbcDatabaseSnapshotGenerator.createSnapshot(JdbcDatabaseSnapshotGenerator.java:244)

我可以简单地删除removeme列,一切都按预期工作。这仅在我们的开发环境中,因此仅针对H2数据库。

1 个答案:

答案 0 :(得分:0)

我基于这个答案解决了这个问题:

How can I use Grails DB Migration with Spring Security and the default DB, H2?

更改了此

static mapping = {
    password column: '`password`'
}

static mapping = {
    password column: 'passwd'
}

基本上上面是首选(IMO),因为它避免了数据库引擎中的混淆,并且不得不处理奇怪的转义 - 只使用通常不是保留字的东西。