在 grails 应用程序中执行 MySQL 脚本
Execute MySQL script in grails app
我有一个 MySQL 脚本,我想在我的 Grails 3.0.9
应用程序 运行ning 时在控制器中执行。我试过这样:
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 语法有误还是我遗漏了什么?
编辑:
当我 运行 脚本手动运行时。所以我认为脚本是正确的,但我执行它的方式不正确。
不确定,但你能试试吗:作为你的 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;
祝你好运!!
问题是 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
文件。
我有一个 MySQL 脚本,我想在我的 Grails 3.0.9
应用程序 运行ning 时在控制器中执行。我试过这样:
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 语法有误还是我遗漏了什么?
编辑:
当我 运行 脚本手动运行时。所以我认为脚本是正确的,但我执行它的方式不正确。
不确定,但你能试试吗:作为你的 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;
祝你好运!!
问题是 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
文件。