经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MySQL » 查看文章
go项目实现mysql接入以及web api
来源:cnblogs  作者:香吧香  时间:2023/8/11 8:35:26  对本文有异议

本文为博主原创,转载请注明出处:

  创建go项目,并在go项目中接入mysql,将mysql的配置项单独整理放到一个胚子和文件中,支持项目启动时,通过加载配置文件中的值,然后创建数据库连接。

  之后使用net/http相关的库,创建路由,并在路由中通过不同的http方法,实现mysql连接的test数据库中users表的增删改查 的 web api

1.在idea中创建go项目

  其目录文件结构如下

                                    

 2.创建配置文件,并初始化数据库

  在项目的根目录下创建数据库的配置文件:config.json

  1. {
  2. "host": "192.168.118.46",
  3. "port": 3306,
  4. "user": "root",
  5. "password": "root",
  6. "dbname": "terra_no"
  7. }

  创建数据库以及表,并插入数据

  1. CREATE TABLE `users` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `name` varchar(12) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  4. `age` int(12) DEFAULT '18',
  5. PRIMARY KEY (`id`)
  6. );
  7. insert into users value (1,"aa",12);
  8. insert into users value (2,"bb",22);

3.创建加载mysql,并创建数据库连接的类

  在项目的根目录下创建database目录,之后创建 mysql.go 文件

  1. package database
  2. import (
  3. "database/sql"
  4. "encoding/json"
  5. "fmt"
  6. _ "github.com/go-sql-driver/mysql"
  7. "io/ioutil"
  8. "log"
  9. )
  10. type MySQLConfig struct {
  11. Host string `json:"host"`
  12. Port int `json:"port"`
  13. User string `json:"user"`
  14. Password string `json:"password"`
  15. DBName string `json:"dbname"`
  16. }
  17. func NewMySQLDB() (*sql.DB, error) {
  18. log.Println("coming NewMySQLDB ...")
  19. config, err := loadMySQLConfig()
  20. log.Println("coming NewMySQLDB config...", config.User, config.Password)
  21. if err != nil {
  22. log.Fatal(err)
  23. return nil, err
  24. }
  25. log.Println("coming NewMySQLDB config...", config)
  26. dbSource := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8", config.User, config.Password, config.Host, config.Port, config.DBName)
  27. log.Println("coming NewMySQLDB config dbSource is ...", dbSource)
  28. db, err := sql.Open("mysql", dbSource)
  29. if err != nil {
  30. log.Fatal(err)
  31. return nil, err
  32. }
  33. if err := db.Ping(); err != nil {
  34. log.Fatal(err)
  35. return nil, err
  36. }
  37. return db, nil
  38. }
  39. func loadMySQLConfig() (*MySQLConfig, error) {
  40. configFile, err := ioutil.ReadFile("config.json")
  41. if err != nil {
  42. log.Fatal("----------error-----------loadMySQLConfig err...", err)
  43. return nil, err
  44. }
  45. var config MySQLConfig
  46. err = json.Unmarshal(configFile, &config)
  47. log.Println("loadMySQLConfig Unmarshal err...", err)
  48. if err != nil {
  49. log.Fatal("---------error----------------loadMySQLConfig Unmarshal err...", config)
  50. return nil, err
  51. }
  52. return &config, nil
  53. }

 

4.创建数据库实体类 user 以及项目所需实体类 ErrorResponse

  user.go 的文件内容如下:

  1. package models
  2. type User struct {
  3. ID uint `json:"id"`
  4. Name string `json:"name"`
  5. Age int `json:"age"`
  6. }
  1. ErrorResponse.go 中的文件内容如下:
  1. package models
  2. type ErrorResponse struct {
  3. Message string `json:"message"`
  4. }

5.编写user表中数据库交互的逻辑

  1. package repositories
  2. import (
  3. "database/sql"
  4. "go_test/models"
  5. )
  6. type UserRepository struct {
  7. DB *sql.DB
  8. }
  9. func (ur *UserRepository) CreateUser(user *models.User) error {
  10. query := "INSERT INTO users (name, age) VALUES (?, ?)"
  11. _, err := ur.DB.Exec(query, user.Name, user.Age)
  12. if err != nil {
  13. return err
  14. }
  15. return nil
  16. }
  17. func (ur *UserRepository) GetUserByID(id uint) (*models.User, error) {
  18. query := "SELECT id, name, age FROM users WHERE id = ?"
  19. row := ur.DB.QueryRow(query, id)
  20. user := new(models.User)
  21. err := row.Scan(&user.ID, &user.Name, &user.Age)
  22. if err != nil {
  23. if err == sql.ErrNoRows {
  24. return nil, nil // 用户不存在
  25. }
  26. return nil, err
  27. }
  28. return user, nil
  29. }
  30. func (ur *UserRepository) GetUsers() ([]*models.User, error) {
  31. query := "SELECT id, name, age FROM "
  32. rows, err := ur.DB.Query(query)
  33. if err != nil {
  34. return nil, err
  35. }
  36. defer rows.Close()
  37. users := []*models.User{}
  38. for rows.Next() {
  39. user := new(models.User)
  40. err := rows.Scan(&user.ID, &user.Name, &user.Age)
  41. if err != nil {
  42. return nil, err
  43. }
  44. users = append(users, user)
  45. }
  46. return users, nil
  47. }
  48. func (ur *UserRepository) UpdateUser(user *models.User) error {
  49. query := "UPDATE users SET name = ?, age = ? WHERE id = ?"
  50. _, err := ur.DB.Exec(query, user.Name, user.Age, user.ID)
  51. if err != nil {
  52. return err
  53. }
  54. return nil
  55. }
  56. func (ur *UserRepository) DeleteUser(id uint) error {
  57. query := "DELETE FROM users WHERE id = ?"
  58. _, err := ur.DB.Exec(query, id)
  59. if err != nil {
  60. return err
  61. }
  62. return nil
  63. }

6.编写处理业务层的service

  1. package services
  2. import (
  3. "errors"
  4.  
  5. "go_test/models"
  6. "go_test/repositories"
  7. )
  8. type UserService struct {
  9. UserRepository *repositories.UserRepository
  10. }
  11. func (us *UserService) CreateUser(user *models.User) error {
  12. if user.Name == "" {
  13. return errors.New("Name is required")
  14. }
  15. if user.Age <= 0 {
  16. return errors.New("Age should be greater than 0")
  17. }
  18. // ... 其他基础业务校验
  19.  
  20. return us.UserRepository.CreateUser(user)
  21. }
  22. func (us *UserService) GetUserByID(id uint) (*models.User, error) {
  23. return us.UserRepository.GetUserByID(id)
  24. }
  25. func (us *UserService) GetUsers() ([]*models.User, error) {
  26. return us.UserRepository.GetUsers()
  27. }
  28. func (us *UserService) UpdateUser(user *models.User) error {
  29. if user.Name == "" {
  30. return errors.New("Name is required")
  31. }
  32. if user.Age <= 0 {
  33. return errors.New("Age should be greater than 0")
  34. }
  35. // ... 其他基础业务校验
  36.  
  37. return us.UserRepository.UpdateUser(user)
  38. }
  39. func (us *UserService) DeleteUser(id uint) error {
  40. return us.UserRepository.DeleteUser(id)
  41. }

7.编写两个项目常用的util

  error_handler.go

  1. package utils
  2. import (
  3. "encoding/json"
  4. "go_test/models"
  5. _ "log"
  6. "net/http"
  7. )
  8. //
  9. //type ErrorResponse struct {
  10. // Message string `json:"message"`
  11. //}
  12.  
  13. func HandleError(w http.ResponseWriter, statusCode int, message string) {
  14. errResponse := models.ErrorResponse{Message: message}
  15. response, _ := json.Marshal(errResponse)
  16. w.Header().Set("Content-Type", "application/json")
  17. w.WriteHeader(statusCode)
  18. w.Write(response)
  19. }
  20. func ErrorHandlerString(w http.ResponseWriter, message string) {
  21. errResponse := models.ErrorResponse{Message: message}
  22. response, _ := json.Marshal(errResponse)
  23. w.Header().Set("Content-Type", "application/json")
  24. //w.WriteHeader(statusCode)
  25. w.Write(response)
  26. }
  27. func ErrorHandler(w http.ResponseWriter, err error) {
  28. if err != nil {
  29. w.WriteHeader(http.StatusInternalServerError)
  30. response := models.ErrorResponse{
  31. Message: err.Error(),
  32. }
  33. json.NewEncoder(w).Encode(response)
  34. return
  35. }
  36. }

 

  json_utils.go

  1. package utils
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. )
  6. func RespondJSON(w http.ResponseWriter, data interface{}, statusCode int) {
  7. w.Header().Set("Content-Type", "application/json")
  8. w.WriteHeader(statusCode)
  9. json.NewEncoder(w).Encode(data)
  10. }

 

8.编写核心类:main.go

  1. package main
  2. import (
  3. _ "database/sql"
  4. "encoding/json"
  5. "go_test/models"
  6. "go_test/utils"
  7. "log"
  8. "net/http"
  9.  
  10. "go_test/database"
  11. "go_test/repositories"
  12. "go_test/services"
  13. )
  14. func main() {
  15. log.Println("coming main method ...")
  16. db, err := database.NewMySQLDB()
  17. if err != nil {
  18. log.Fatal(err)
  19. }
  20. userRepository := &repositories.UserRepository{
  21. DB: db,
  22. }
  23. userService := &services.UserService{
  24. UserRepository: userRepository,
  25. }
  26. http.HandleFunc("/users", func(w http.ResponseWriter, r *http.Request) {
  27. switch r.Method {
  28. case http.MethodGet:
  29. users, err := userService.GetUsers()
  30. if err != nil {
  31. utils.ErrorHandler(w, err)
  32. return
  33. }
  34. utils.RespondJSON(w, users, http.StatusOK)
  35. case http.MethodPost:
  36. var user models.User
  37. err := json.NewDecoder(r.Body).Decode(&user)
  38. if err != nil {
  39. utils.ErrorHandler(w, err)
  40. return
  41. }
  42. err = userService.CreateUser(&user)
  43. if err != nil {
  44. utils.ErrorHandler(w, err)
  45. return
  46. }
  47. utils.RespondJSON(w, user, http.StatusCreated)
  48. default:
  49. w.WriteHeader(http.StatusMethodNotAllowed)
  50. response := models.ErrorResponse{
  51. Message: "Method not allowed",
  52. }
  53. json.NewEncoder(w).Encode(response)
  54. }
  55. })
  56. log.Println("Server is running on port 8000")
  57. log.Fatal(http.ListenAndServe(":8000", nil))
  58. }

 

9.在服务器上部署和验证

  linux上传代码并进行编译项目

             

  linux上启动项目

  调用api:

 

 

 

 

  

原文链接:https://www.cnblogs.com/zjdxr-up/p/17621997.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号