“grails数据库迁移”;“未找到列”;错误

“grails数据库迁移”;“未找到列”;错误,grails,database-migration,Grails,Database Migration,我正在使用grails数据库迁移插件:运行时:数据库迁移:1.4.1'。对于最初的changelog,一切似乎都正常,甚至从H2开发数据库到mysql 然而,我想测试一个实际的模型更改,但是我得到了一个我无法理解的错误 我们有以下用户模型: class User { // spring security params: transient springSecurityService String username String password //

我正在使用grails数据库迁移插件:
运行时:数据库迁移:1.4.1'
。对于最初的changelog,一切似乎都正常,甚至从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--addchange\u-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数据库。

我基本上是根据以下答案解决这个问题的:

改变了这个

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

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

static mapping = {
    password column: 'passwd'
}