【问题标题】:Grails with PostgreSQL not generating tables带有 PostgreSQL 的 Grails 不生成表
【发布时间】:2012-10-09 14:21:37
【问题描述】:

所以我有一些简单的域类,我确保它们没有使用任何 PostgreSQL(或任何其他供应商,就此而言)保留字。执行 grails schema-export 会产生一个 ddl,当对同一个数据库运行时,它会成功执行,并毫无问题地创建所有表。

但是,在运行我的 grails 应用程序时,我收到错误 ERROR: relation "artist" does not exist。 (艺术家是我试图在 BootStrap.groovy 中创建示例的域)。

查看我的数据库,我可以看到没有为我的域创建任何表。

我已启用org.hibernate 的所有日志记录,但那里没有任何迹象表明有任何问题。我能看到的唯一问题是没有与任何表的创建相关的日志记录,只有简单选择的示例查询。

这是我的 DataSource.groovy:

dataSource {
    pooled = true
    driverClassName = "org.postgresql.Driver"
    dialect = "org.hibernate.dialect.PostgreSQLDialect"
    username = "my_username"
    password = "my_password"
}
hibernate {
    cache.use_second_level_cache = false
    cache.use_query_cache = false
    cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory'
}
// environment specific settings
environments {
    development {
        dataSource {
            dbcreate = "create-drop"
            url = "jdbc:postgresql://localhost:5432/dev"
        }
    }
    test {
        dataSource {
            dbCreate = "update"
            url = "jdbc:postgresql://localhost:5432/test"
        }
    }
    production {
        dataSource {
            dbCreate = "update"
            url = "jdbc:postgresql://localhost:5432/prod"
            pooled = true
            properties {
               maxActive = -1
               minEvictableIdleTimeMillis=1800000
               timeBetweenEvictionRunsMillis=1800000
               numTestsPerEvictionRun=3
               testOnBorrow=true
               testWhileIdle=true
               testOnReturn=true
               validationQuery="SELECT 1"
           }
       }
    }
}

我已经验证了凭据(上面的假冒)是有效的,用户有权限,数据库在指定位置运行等等。

我是否遗漏了什么,或者我可以启用的任何其他类型的日志记录可能会显示错误是什么,或者有助于找到它?

我觉得最奇怪的是schema-export 生成的ddl 运行得很好。 grails 在运行时是否会以不同的方式生成 SQL,或者有什么会导致 grails 不执行任何 create 语句?

Grails 版本 2.1.1,PostgreSQL 9.2.1

按要求启动引导:

import my.site.domain.artist.*

class BootStrap {

    def init = { servletContext ->
        System.out.println("\n")
        log.info("---------------------------------------------------")
        log.info("BootStrap initializing...")
        log.info("---------------------------------------------------")
        TimeZone.setDefault(TimeZone.getTimeZone("UTC"))
        log.info("Default TimeZone set to " + TimeZone.getDefault().displayName)

        Artist artist = new Artist(artistName: 'Artist Name', shortBio: "Short Bio", biography: "Bio", url: "/some_artist")

        artist.save()
        if(artist.hasErrors()) {
            log.info(artist.errors)
        } else {
            log.info("--Artist--")
            log.info("dateCreated: " + artist.dateCreated)
            log.info("lastUpdated: " + artist.lastUpdated)
            log.info("mediumImageURL: " + artist.mediumImageURL)
        }
    }

    def destroy = {
    }
}

【问题讨论】:

  • 我看不出你的配置有什么明显的问题,和我用的差不多。但我不是专家。我使用 postgresql 进行生产,使用 H2 进行开发。完全没有问题。如果你在开发环境中使用 H2,那么它可以工作吗?
  • 请向我们展示您的引导代码
  • 使用 H2 我认为一切都很好,但很难说,因为我在 BootStrap 中从来没有任何东西,而且我从来没有真正检查过表格。可以肯定的是,我通过控制器创建了一个域,并且它没有失败地保存。当我有更多时间时,我会再次检查 H2。上面添加了 BootStrap。
  • 尝试将“logSql = true”添加到您的开发配置中,看看它是否至少在尝试生成语句
  • 这似乎产生了与org.hibernate 输出相同的日志记录,它没有显示任何创建 SQL。它真正产生的唯一输出是数据库配置和简单的 CRUD 操作(我假设它会保存以供以后使用)。不幸的是,没有什么会引发任何警报。

标签: hibernate postgresql grails grails-orm


【解决方案1】:

这可能是 pgsql 和 gorm 的特性,因为它与自动生成的 ID 序列以及 id 是 pgsql 中的保留字有关。确保在您的域对象中使用类似 user_id(具有适当的表语法)而不是 id。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    • 2020-03-28
    相关资源
    最近更新 更多