【发布时间】:2021-08-23 06:08:18
【问题描述】:
我正在将使用 Go 和 MySQl 为数据库创建的 API 部署到 Heroku。我正在关注此guide 并设置所有内容,但现在我正在尝试执行 MySQL 脚本来设置带有一些虚拟数据的表。但是我经常收到错误消息,说脚本错误,即使我在本地使用它也没有问题。我已经将 MySQL 数据库连接到 Heroku 环境,启动数据库没有报错。
以下是在将其部署到 Heroku 时显示错误的日志:
2021-06-05T12:49:16.442359+00:00 app[web.1]: ERROR 2021/06/05 12:49:16 main.go:45: Error executing SQL script : 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 'USE assessment;
schema.sql
CREATE DATABASE assessment;
USE assessment;
CREATE TABLE users (
id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
email VARCHAR(255) NOT NULL
);
INSERT INTO `users` VALUES (1,"test1@gmail.com");
INSERT INTO `users` VALUES (2,"test2@gmail.com");
INSERT INTO `users` VALUES (3,"test3@gmail.com");
INSERT INTO `users` VALUES (4,"test4@gmail.com");
INSERT INTO `users` VALUES (5,"test5@gmail.com");
CREATE TABLE features (
feature_id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
user_id INTEGER NOT NULL,
feature_name VARCHAR(100) NOT NULL,
can_access BOOLEAN NOT NULL DEFAULT FALSE,
FOREIGN KEY (user_id) REFERENCES users(id)
);
INSERT INTO `features` VALUES (1, 1, "automated-investing", 1);
INSERT INTO `features` VALUES (2, 1, "crypto", 0);
INSERT INTO `features` VALUES (3, 2, "crypto", 0);
INSERT INTO `features` VALUES (4, 3, "automated-investing", 0);
INSERT INTO `features` VALUES (5, 4, "automated-investing", 1);
INSERT INTO `features` VALUES (7, 1, "financial-tracking", 1);
INSERT INTO `features` VALUES (8, 2, "financial-tracking", 0);
INSERT INTO `features` VALUES (9, 3, "financial-tracking", 1);
INSERT INTO `features` VALUES (10, 4, "financial-tracking", 0);
main.go
package main
import (
"io/ioutil"
"log"
"net/http"
"os"
"time"
_ "github.com/go-sql-driver/mysql"
"github.com/gorilla/mux"
"github.com/joho/godotenv"
"github.com/yudhiesh/api/controller"
"github.com/yudhiesh/api/middleware"
)
func main() {
router := mux.NewRouter()
router.Use(middleware.ResponseHeaders)
router.Use(middleware.LogRequest)
errorLog := log.New(os.Stderr, "ERROR\t", log.Ldate|log.Ltime|log.Lshortfile)
infoLog := log.New(os.Stdout, "INFO\t", log.Ldate|log.Ltime)
err := godotenv.Load(".env")
port := os.Getenv("PORT")
if port == "" {
errorLog.Fatal("$PORT is not set")
}
dsn := os.Getenv("DSN")
if dsn == "" {
errorLog.Fatal("$DATABASE_URL is not set")
}
db, err := controller.OpenDB(dsn)
if err != nil {
errorLog.Fatal(err)
}
defer db.Close()
c, ioErr := ioutil.ReadFile("./schema.sql")
sqlScript := string(c)
if ioErr != nil {
errorLog.Fatalf("Error loading SQL schema : %s", ioErr)
}
_, err = db.Exec(sqlScript)
if err != nil {
// FAILS HERE!
errorLog.Fatalf("Error executing SQL script : %s", err)
}
app := &controller.Application{
DB: db,
ErrorLog: errorLog,
InfoLog: infoLog,
}
addr := ":" + port
server := &http.Server{
Handler: router,
Addr: addr,
WriteTimeout: 15 * time.Second,
ReadTimeout: 15 * time.Second,
}
router.HandleFunc("/feature", app.GetCanAccess).Methods("GET")
router.HandleFunc("/feature", app.InsertFeature).Methods("POST")
http.Handle("/", router)
infoLog.Printf("Connected to port %s", port)
errorLog.Fatal(server.ListenAndServe())
}
【问题讨论】: