“grails数据库迁移”;“未找到列”;错误
我正在使用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 //
运行时:数据库迁移: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'
}