0

我正在开发一个 grails webapp,它将从我已经设置并使用 groovy 连接到的 mySQL 数据库中“获取”数据,并在表中显示所述数据(现在正在运行的线程总数)以及在图表中。我已经到处搜索了,我发现:

def sql = Sql.newInstance("jdbc:mysql://localhost:3306/mydatabase",
        "root", pw, "com.mysql.jdbc.Driver")
    sql.eachRow("SELECT second, threads FROM threadcount " ){
        println it.seconds
        println it.threads
            }

将从我的表“threadcount”中获取我的数据并将其打印在控制台中。上面的代码是我现在在我的控制器文件中编写的。这很好,它可以工作,但我希望能够在网页上显示它。我还阅读了一些 grails 教程,并了解到从我的数据库中获取数据的另一种方法是执行以下操作。

    def current = { 
    def allProjects = Threadcount.list()
    [dbContent:allProjects]

}

在我的 grails 视图文件中,我有这个:

<html>
<head>
  <title>Active Threads</title>
</head>
<body>
   <table border = "1">
   <g:each in = "${dbContent}" status = "i" var = "thisProject">
     <tr>
         <th>SECOND</th>
         <th>THREADS</th>
     </tr>
     <tr>
          <td>${thisProject.second}</td>
          <td>${thisProject.threads}</td>
     </tr>
   </g:each>
   </table>
</body>
</html>

但无论我做什么或是否使用 sql.query、sql.row、sql.eachRow 或 Threadcount.list(),我都无法显示我的所有数据。我的数据库中有 14 个主菜。使用 Threadcount.list() 方法,我只得到我的 mySQL 表的第一行,当我使用任何 sql 时。方法我什至没有让第一行出现。我刚刚收到以下错误消息:

没有这样的属性:类的 dbConent2:threadsapp.ThreadcountController

至于我的问题。我究竟做错了什么?或者有什么更好的方法来做到这一点?为什么

dbContent2<<it.toRowResult()
[dbContent:dbContent2]

也不行?

在这一点上,我不知道还能尝试什么,这就是我来这里的原因。在此先感谢,对于冗长而冗长的问题,我们深表歉意

PS这里是我读到的一些关于 groovy 和 sql
groovy sql
groovy 数据库特性的网站

4

1 回答 1

1

你说:

grails 无缘无故地添加了“version”和“id”。所以我删除了域文件。

Grails 添加 ID 和版本是有原因的,如果您不需要它们,您可以配置 Grails 不添加它们。但是,我建议遵循 Grails 约定,因为它是最佳实践和经验的结果,最终形成了框架。

因为version它很简单:

class Threadcount {
    …
    static mapping = {
        version false
    }
}

对于 ID,您可以使用现有的唯一键或在此处创建复合键。

 static mapping = {
        id composite: ['firstName', 'lastName']
    }

其他组合看这里

或者,如果您已经有一个构建数据库,Grails 允许您在此处毫无问题地映射到它。

基本上你可以告诉 Grails 不要只使用我所拥有的创建任何数据库对象,查看 dataSource.groovy。

 development {
        dataSource {
            dbCreate = "validate" // one of 'create', 'create-drop', 'update', 'validate', ''
            url = "jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000"
        }
    }

不使用 Grails 域类会给自己带来很多问题。这些教程遵循 Grails 约定并假设您正在使用基本的 MVC 模型。

我假设您已经拥有域时已经有了这条线,如果您正确映射域和表allProjects应该返回 Threadcount 表中的所有记录。

def current = { 
    def allProjects = Threadcount.list()
    [dbContent:allProjects]

}

为了解决您的问题,我建议首先使用显示基本域操作的众多教程之一正确映射您的域,这也将消除对数据库执行直接查询并帮助您非常有效地迭代数据。

于 2013-07-02T18:05:00.953 回答