登录
首页 >  数据库 >  MySQL

Go Web编程--应用数据库

来源:SegmentFault

时间:2023-01-19 12:39:10 192浏览 收藏

在IT行业这个发展更新速度很快的行业,只有不停止的学习,才不会被行业所淘汰。如果你是数据库学习者,那么本文《Go Web编程--应用数据库》就很适合你!本篇内容主要包括Go Web编程--应用数据库,希望对大家的知识积累有所帮助,助力实战开发!


今天我们继续接着前几篇关于
version: '3'
services:
  ......
  # The Database
  database:
    image: mysql:5.7
    volumes:
      - dbdata:/var/lib/mysql
    environment:
      - "MYSQL_DATABASE=go_web"
      - "MYSQL_USER=go_web"
      - "MYSQL_PASSWORD=go_web"
      - "MYSQL_ROOT_PASSWORD=secret"
    ports:
      - "33063:3306"

volumes:
  dbdata:
  • 因为容器退出时会销毁容器内的所有文件,所以对于
    version: '3'
    services:
      # The Application
      app:
        image: golang:latest
        working_dir: /go/src/example.com/http_demo
        volumes:
          - /$GOPATH/src/example.com/http_demo:/go/src/example.com/http_demo
          - /$GOPATH/src:/go/src
        ports:
          - "8000:8080"
        environment:
          WORKING_DIR: /go/src/example.com/http_demo
        command: go run /go/src/example.com/http_demo/main.go
    
      # The Database
      database:
        image: mysql:5.7
        volumes:
          - dbdata:/var/lib/mysql
        environment:
          - "MYSQL_DATABASE=go_web"
          - "MYSQL_USER=go_web"
          - "MYSQL_PASSWORD=go_web"
          - "MYSQL_ROOT_PASSWORD=secret"
        ports:
          - "33063:3306"
    
    volumes:
      dbdata:

    可以公众号内发送

    go get -u github.com/go-sql-driver/mysql

    连接MySQL数据库

    要检查我们是否可以连接到数据库,我们需要导入

    import (
        "database/sql"
        _ "github.com/go-sql-driver/mysql"
        "log"
    )
    
    func MysqlDemoCode() {
    
        db, err := sql.Open("mysql", "go_web:go_web@tcp(127.0.0.1:3306)/go_web")
        if err != nil {
            log.Fatal(err)
        }
        defer db.Close()
    
        if err := db.Ping(); err != nil {
            log.Fatal(err)
        }
    }
    • 你的代码应仅引用在
      query := `
         CREATE TABLE users (
             id INT AUTO_INCREMENT,
             username TEXT NOT NULL,
             password TEXT NOT NULL,
             created_at DATETIME,
             PRIMARY KEY (id)
         );`
      // 执行后一定要检查err
      _, err := db.Exec(query)

      插入新数据

      默认情况下,Go使用准备好的语句(prepare)将动态数据插入到我们的SQL语句中,这是一种将用户提供的数据安全地传递到我们的数据库而不会造成任何损坏的方式。在Web编程的早期,程序员将数据和查询直接传递给数据库,这导致了巨大的漏洞,并可能破坏整个Web应用程序。

      要将我们的第一个用户插入数据库表,我们将创建一个如下的SQL查询。语句中的问号告诉SQL驱动程序,它们是实际数据的占位符。下面你可以看到我们讨论的准备好的语句:

      username := "johndoe"
      password := "secret"
      createdAt := time.Now()
      
      result, err := db.Exec(`INSERT INTO users (username, password, created_at) VALUES (?, ?, ?)`, username, password, createdAt)

      结果包含最后插入的ID(自增ID)的信息以及此查询影响的行数。

      var (
          id        int
          username  string
          password  string
          createdAt time.Time
      )
      
      query := `SELECT id, username, password, created_at FROM users WHERE id = ?`
      err := db.QueryRow(query, 1).Scan(&id, &username, &password, &createdAt)

      查询多行

      上面我们演示了如何查询单个用户行, 接下来演示下如何查询多个数据行并将数据存储到结构体切片中:

      type user struct {
          id        int
          username  string
          password  string
          createdAt time.Time
      }
      
      rows, err := db.Query(`SELECT id, username, password, created_at FROM users`) //检查错误
      defer rows.Close()
      
      var users []user
      for rows.Next() {
          var u user
          err := rows.Scan(&u.id, &u.username, &u.password, &u.createdAt) 
          users = append(users, u)
      }
      err := rows.Err() //检查错误

      篇幅原因代码中所有的错误检查都被故意忽略了,在实际使用中一定要记得做错误检查。

      users {
          user {
              id:        1,
              username:  "Joshua",
              password:  "secret",
              createdAt: time.Time{wall: 0x0, ext: 63701044325, loc: (*time.Location)(nil)},
          },
          user {
              id:        2,
              username:  "alice",
              password:  "bob",
              createdAt: time.Time{wall: 0x0, ext: 63701044622, loc: (*time.Location)(nil)},
          },
      }

      删除表数据

      从我们的表中删除数据同创建表和插入数据一样也是使用

      result, err := db.Exec(`DELETE FROM users WHERE id = ?`, 1) // 记得检查错误

      后续

      database/sql
      提供的
      MySQL
      查询功能还是很全面的使用的更多介绍可以参考http://go-database-sql.org/in...,不过它是一个相对偏底层的库。实际开发中往往会使用一些在它的基础上封装的
      ORM
      库。
      ORM
      的查询使用起来更简单些,语法表达力更强也更方便于代码管理。所以今天的文章主要是对
      database/sql
      做一下简单介绍,入门即可,后续关于
      ORM
      库的使用时再介绍更多查询的使用方法。另外也在我们的
      Docker
      环境中增加了
      MySQL
      容器,大家也不要忘记更新。

      公众号回复

      gohttp04
      获取更新后的
      Docker
      编排文件和文章中用到的源代码。

      前文回顾

      深入学习用Go编写HTTP服务器

      Web服务器路由

      用Docker快速搭建Go开发环境

      十分钟学会用Go编写Web中间件

      tWbHIMFsM3.png

      今天关于《Go Web编程--应用数据库》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表