当前位置:首页 > 文章列表 > 数据库 > MySQL > Go Web编程--应用数据库

Go Web编程--应用数据库

来源:SegmentFault 2023-01-19 12:39:10 0浏览 收藏

在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删除
MySQL8.0.19的InnoDB ReplicaSetMySQL8.0.19的InnoDB ReplicaSet
上一篇
MySQL8.0.19的InnoDB ReplicaSet
WebFlux系列(十三)MySql应用新增、修改、查询、删除
下一篇
WebFlux系列(十三)MySql应用新增、修改、查询、删除
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    508次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    497次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • 笔灵AI生成答辩PPT:高效制作学术与职场PPT的利器
    笔灵AI生成答辩PPT
    探索笔灵AI生成答辩PPT的强大功能,快速制作高质量答辩PPT。精准内容提取、多样模板匹配、数据可视化、配套自述稿生成,让您的学术和职场展示更加专业与高效。
    16次使用
  • 知网AIGC检测服务系统:精准识别学术文本中的AI生成内容
    知网AIGC检测服务系统
    知网AIGC检测服务系统,专注于检测学术文本中的疑似AI生成内容。依托知网海量高质量文献资源,结合先进的“知识增强AIGC检测技术”,系统能够从语言模式和语义逻辑两方面精准识别AI生成内容,适用于学术研究、教育和企业领域,确保文本的真实性和原创性。
    24次使用
  • AIGC检测服务:AIbiye助力确保论文原创性
    AIGC检测-Aibiye
    AIbiye官网推出的AIGC检测服务,专注于检测ChatGPT、Gemini、Claude等AIGC工具生成的文本,帮助用户确保论文的原创性和学术规范。支持txt和doc(x)格式,检测范围为论文正文,提供高准确性和便捷的用户体验。
    30次使用
  • 易笔AI论文平台:快速生成高质量学术论文的利器
    易笔AI论文
    易笔AI论文平台提供自动写作、格式校对、查重检测等功能,支持多种学术领域的论文生成。价格优惠,界面友好,操作简便,适用于学术研究者、学生及论文辅导机构。
    42次使用
  • 笔启AI论文写作平台:多类型论文生成与多语言支持
    笔启AI论文写作平台
    笔启AI论文写作平台提供多类型论文生成服务,支持多语言写作,满足学术研究者、学生和职场人士的需求。平台采用AI 4.0版本,确保论文质量和原创性,并提供查重保障和隐私保护。
    35次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码