在grails app中执行MySQL脚本

时间:2016-03-24 13:59:06

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

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

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语法错了还是我错过了其他的东西?

修改

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

2 个答案:

答案 0 :(得分:1)

问题是sql.execute(sqlString)想要一个GString并且我已经给它一个正常的String所以它添加了引号,结果是一个不正确的MySQL语法,如描述{{3} }。

这就是我的工作方式:

    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个文件。

答案 1 :(得分:0)

不确定,但您可以尝试:作为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;
祝你好运!!