package main
import (
"database/sql"
"encoding/json"
"fmt"
"log"
"net/http"
"github.com/gorilla/mux"
_ "github.com/lib/pq"
)
func logFatal(err error) {
if err != nil {
log.Fatal(err)
}
}
const (
HOST = "localhost"
PORT = 5432
USER = "Blablabla"
PASSWORD = ""
DBNAME = "student"
)
type student struct {
ID int `json:"id"`
Name string `json:"name"`
Department string `json:"department"`
Year_Joined string `json:"year_joined"`
}
var students []student
var db *sql.DB
func main() {
psqlInfo := fmt.Sprintf("host=%s port=%d user=%s "+
"password=%s dbname=%s sslmode=disable",
HOST, PORT, USER, PASSWORD, DBNAME)
var err error
db, err = sql.Open("postgres", psqlInfo)
logFatal(err)
err = db.Ping()
if err != nil {
log.Fatal(err)
}
fmt.Println("Connected")
router := mux.NewRouter()
router.HandleFunc("/students", getStudents).Methods("GET")
log.Fatal(http.ListenAndServe(":8000", router))
}
func getStudents(w http.ResponseWriter, r *http.Request) {
var theStudent student
students = []student{}
rows, err := db.Query("select * from students")
if err != nil {
fmt.Print("there was an error", err)
}
for rows.Next() {
err := rows.Scan(&theStudent.ID, &theStudent.Name, &theStudent.Department, &theStudent.Year_Joined)
if err != nil {
log.Fatal(err)
}
students = append(students, theStudent)
}
json.NewEncoder(w).Encode(students)
}
这是数据库
Last login: Sat May 29 07:24:12 on ttys003
/Applications/Postgres.app/Contents/Versions/11/bin/psql -p5432 "student"
~ new-feature ●✚ /Applications/Postgres.app/Contents/Versions/11/bin/psql -p5432 "student"
psql (11.2)
Type "help" for help.
student=# select * from students;
id | name | department | year_joined
----+-------+------------+-------------
1 | ola | csc | 1990
2 | Kenny | math | 2019
(2 rows)
student=#
这是我从vscode终端得到的结果
Connected
there was an error pq: relation "students" does not exist<nil>`enter code here`
经过逐行调试,我意识到与数据库的连接是有效的,但问题出在postgresql语法上,该语法应该是"selectfrom table",而不是"select*from table"。这意味着它不支持select与((和(*(from之间的空格。感谢