【问题标题】:Execute MySQL script in grails app在 grails 应用程序中执行 MySQL 脚本
【发布时间】:2016-03-24 13:59:05
【问题描述】:

当我的Grails 3.0.9 应用程序运行时,我想在控制器中执行一个 MySQL 脚本。我试过这样:

import groovy.sql.Sql
import grails.util.Holders

    def void clearDatabase() {
        String sqlFilePath = 'path/to/file/clear_database.sql'
        String sqlString = new File(sqlFilePath).text
        def sql = Sql.newInstance(Holders.config.dataSource.url, Holders.config.dataSource.username, Holders.config.dataSource.password, Holders.config.dataSource.driverClassName)
        sql.execute(sqlString)
    }

这就是我的clear_database.sql 文件的样子:

SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE table_a;
TRUNCATE table_b;
TRUNCATE table_c;
SET FOREIGN_KEY_CHECKS = 1;

这就是我得到的错误信息:

WARN org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Warning Code: 1064, SQLState: 42000
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TRUNCATE table_a;

是我的 MySQL 语法错误还是我遗漏了什么?

编辑:

当我手动运行脚本时,它可以工作。所以我认为脚本是正确的,但我执行它的方式不是。

【问题讨论】:

    标签: mysql grails grails-orm grails-3.0 sql-scripts


    【解决方案1】:

    问题是sql.execute(sqlString) 想要一个GString,而我给了它一个普通的String,所以它添加了引号,结果是一个不正确的MySQL 语法,如here 所述。

    这对我来说是这样的:

        def sql = Sql.newInstance(Holders.config.dataSource.url, Holders.config.dataSource.username, Holders.config.dataSource.password, Holders.config.dataSource.driverClassName)
        sql.execute "SET FOREIGN_KEY_CHECKS = 0;"
        sql.execute "truncate ${Sql.expand("table_a")}"
        sql.execute "truncate ${Sql.expand("table_b")}"
        sql.execute "truncate ${Sql.expand("table_c")}"
        sql.execute "SET FOREIGN_KEY_CHECKS = 1;"
    

    不再需要clear_database.sql 文件。

    【讨论】:

      【解决方案2】:

      不确定,但你可以试试:作为你的clear_database.sql

          SET FOREIGN_KEY_CHECKS = 0;
          TRUNCATE TABLE table_a;
          TRUNCATE TABLE table_b;
          TRUNCATE TABLE table_c;
          SET FOREIGN_KEY_CHECKS = 1;
      

      祝你好运!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-23
        • 2013-09-09
        • 1970-01-01
        • 2022-10-18
        相关资源
        最近更新 更多