2016-03-24 6 views
0

Ich habe ein MySQL-Skript, das ich in einem Controller ausführen möchte, wenn meine Grails 3.0.9 Anwendung ausgeführt wird. Ich habe es auf diese Weise versucht:Führen Sie MySQL-Skript in Grails App

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) 
    } 

Das ist, wie meine clear_database.sql Datei wie folgt aussieht:

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

Das ist die Fehlermeldung erhalte ich:

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; 

Ist meine MySQL-Syntax falsch oder Vermisse ich etwas anderes?

edit:

Als ich das Skript ausführen manuell funktioniert es. Also ich denke das Skript ist korrekt aber so wie ich es nicht ausführe.

Antwort

1

Das Problem war, dass sql.execute(sqlString) eine GString will und ich habe es gegeben ein normaler String so hinzugefügt, um es zitiert und das Ergebnis war eine falsche MySQL Syntax wie beschrieben here.

So ist es für mich funktioniert:

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;" 

Es gibt keine clear_database.sql Datei mehr benötigt.

0

nicht sicher, aber könnten Sie versuchen: als 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; 

Viel Glück !!

+0

Dies funktioniert auch nicht, bekomme den gleichen Fehler. : / – Peter