我一直试图从我的 Grails 应用程序连接到 PostgreSQL 数据库的遗留表几天,但没有成功。
我想要什么
我想要的只是从我的grails应用程序查询此表(已存储用户)以检查登录凭据。用户登录grails应用程序,我必须检查提供的密码是否与此表中存储的密码匹配。
由于我尝试访问的表名为“ user ”(这是一个关键字),我创建了一个别名视图“ users ”,这是一个我使用grails,只是为了避免可能的问题。
下面我提供有关我的问题的其他信息,希望有人可以帮助我。
手动查询结果
在控制台中直接从postgres执行select * from public.users
时,我得到以下结果:
id | name | apikey | created | about | openid | password | fullname | email | reset_key
--------------------------------------+-----------+---------------------------+----------------------------+-------+--------+-------------------------------+----------+------------------------------+-----------
ef8661be-6627-40e3-8b58-e78f3363680f | logged_in | this-is-an-api-key-sample | 2012-12-11 14:17:28.949515 | | | | | |
0c49f23a-350c-43d9-a1ec-34057125acd7 | visitor | this-is-an-api-key-sample | 2012-12-11 14:17:28.953194 | | | | | |
591798d4-f85e-4bc2-a352-a41635c83653 | admin | this-is-an-api-key-sample | 2013-04-10 15:08:47.104103 | | | thisisanencodedpasswordsample | admin | username@email.com |
25c8b15f-ec67-472b-b551-3c7112d4a2db | grails | this-is-an-api-key-sample | 2013-04-10 15:12:44.257821 | | | thisisanencodedpasswordsample | grails | username@email.com |
从我的grails app我有以下文件:
用户域类
class User {
String user_id
String name
String apikey
String created
String about
String openid
String password
String fullname
String email
String resetKey
static mapping = {
version false
autoTimestamp false
table "public.users"
resetKey column: "reset_key"
created column: "created", sqlType: "timestamp without time zone"
user_id column: "id", sqlType: "text"
id name: 'user_id'
}
}
数据源
dataSource {
pooled = true
dbCreate = "validate"
logSql = true
url: "jdbc:postgresql://192.168.1.100:5432/ecodata"
driverClassName = "org.postgresql.Driver"
dialect = net.sf.hibernate.dialect.PostgreSQLDialect
username = "ecodata"
password = "******"
}
POM依赖
<dependency>
<groupId>org.grails.plugins</groupId>
<artifactId>hibernate</artifactId>
<version>2.1.2</version>
<scope>runtime</scope>
<type>zip</type>
</dependency>
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.1-901.jdbc4</version>
<scope>runtime</scope>
</dependency>
错误我在启动Grails应用时遇到的错误是:
[...]由以下原因引起:org.hibernate.HibernateException:缺少表: 用户 [...]
我希望有人可以帮忙解决这个问题。 提前谢谢。
此致
答案 0 :(得分:3)
我终于解决了问题!实际上这是我的错,虽然这是一个难以察觉的棘手错字......
在我的dataSource中,您可以看到以下行:
url: "jdbc:postgresql://192.168.1.100:5432/ecodata"
但实际应该是:
url = "jdbc:postgresql://192.168.1.100:5432/ecodata"
当我调整grails与数据库连接的深度时,我意识到了这个错字。我看到除数据源的url之外的所有内容都有正确的配置。 url字段具有默认的内存数据库值。那很奇怪......然后,再次仔细检查dataSource,我看到了冒号而不是等号。该死的!我喜欢动态语言,但这种拼写错误可能非常令人沮丧...
第一个问题解决了。
另一个问题: hibernate_sequence错误(也已解决)
一旦我解决了前一个问题,就会出现另一个错误:
Caused by: org.hibernate.HibernateException: Missing sequence or table: hibernate_sequence
在阅读了一下后,我发现由于对遗留数据库执行的验证而发生此错误。我解决了删除验证的问题。这样做是注释以下行(也在dataSource中)
// dbCreate = "validate"
我希望这篇文章可以帮助将来的某个人。这就是为什么我将解决方案发布到我最初的问题以及hibernate_sequence
问题。