【发布时间】:2020-09-24 00:39:55
【问题描述】:
我正在编写一个脚本,其目的是:根据包含后缀日期时间的旧表设置表名(例如 table_1_2020_01_01,根据旧表的模式为该表创建一个模式,然后将数据插入到该表中旧表中的表。
我创建了三个 MySQL 语句,用于设置表名,创建表,然后将数据插入到创建的表中:
SET @TABLE_NAME = CONCAT(DATE_FORMAT(NOW(), '%Y_%m_%d'), '_new_table');
SET @SQL = CONCAT('CREATE TABLE IF NOT EXISTS', @TABLE_NAME, 'LIKE old_table');
PREPARE stmt FROM @SQL;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @SQL = CONCAT('INSERT INTO', @TABLE_NAME, 'SELECT * FROM old_table WHERE id = ?');
PREPARE stmt FROM @SQL;
EXECUTE stmt USING @id;
DEALLOCATE PREPARE stmt;
但是,每次我从 main 运行我的 run my func 时,我都会收到此错误:
panic: Error 1064: 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 'PREPARE stmt FROM @SQL;
EXECUTE stmt;
DEALLOCATE PREPARE stmt' at line
我在 golang 中发现 Set Table name as a var。所以我的解决方案是使用准备好的语句并将 var 传递给准备好的语句。
可能是这样的:
stmt, err := tx.Prepare("CREATE TABLE (?) ...")
if err != nil {
log.Fatal(err)
}
defer stmt.Close() // danger!
_, err = stmt.Exec(tableNameVariable)
有没有办法可以使用 _, err = db.Exec( 来运行上述查询,或者有更好的方法吗?
【问题讨论】:
标签: go