ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[go-每日一库]golang-gorm的快速入门(一)

2022-06-10 23:36:07  阅读:214  来源: 互联网

标签:username users 数据库 tizi365 golang 一库 MYSQL go gorm


原文:(一)GORM快速入门教程 https://www.cnblogs.com/infodriven/p/16348116.html

1.介绍

GORM是Golang目前比较人们的数据库ORM操作库,对开发者也比较友好,使用非常简单,使用上主要就是把struct类型和数据库表记录进行映射,操作数据库的时候不需要直接手写Sql代码,这里主要介绍MYSQL数据库。
GORM库github地址:https://github.com/go-gorm/gorm

2.入门例子

先看看gorm(v2)怎么使用。

2.1 安装依赖

操作MYSQL需要安装两个包:

  • MYSQL驱动包
  • GORM包 使用go get命令安装依赖包
//安装MySQL驱动
go get -u gorm.io/driver/mysql
//安装gorm包
go get -u gorm.io/gorm

2.2 导入依赖包

import (
  "gorm.io/driver/mysql" // v2版本不需要“_”
  "gorm.io/gorm"
)

2.3 GORM操作MYSQL例子

使用gorm库操作MYSQL步骤:

  1. 使用struct定义模型,模型主要用在golang中代表mysql表
  2. 使用gorm创建数据库连接
  3. 使用gorm操作数据库。

下面是例子用到的users表结构定义DDL:

CREATE TABLE `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID',
  `username` varchar(30) NOT NULL COMMENT '账号',
  `password` varchar(100) NOT NULL COMMENT '密码',
  `createtime` int(10) NOT NULL DEFAULT 0 COMMENT '创建时间',
   PRIMARY KEY (`id`)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8

代码示例

package main

import (
  "gorm.io/driver/mysql"
  "gorm.io/gorm"
  "fmt"
  "time"
  "errors"
)

//定义User模型,绑定users表,ORM库操作数据库,需要定义一个struct类型和MYSQL表进行绑定或者叫映射,struct字段和MYSQL表字段一一对应
//在这里User类型可以代表mysql users表
type User struct {
    ID int64 // 主键
    //通过在字段后面的标签说明,定义golang字段和表字段的关系
    //例如 `gorm:"column:username"` 标签说明含义是: Mysql表的列名(字段名)为username
    //这里golang定义的Username变量和MYSQL表字段username一样,他们的名字可以不一样。
    Username string `gorm:"column:username"`
    Password string `gorm:"column:password"`
    //创建时间,时间戳
    CreateTime int64 `gorm:"column:createtime"`
}

//设置表名,可以通过给struct类型定义 TableName函数,返回当前struct绑定的mysql表名是什么
func (u User) TableName() string {
    //绑定MYSQL表名为users
    return "users"
}

func main()  {
    //配置MySQL连接参数
    username := "root"  //账号
    password := "123456" //密码
    host := "127.0.0.1" //数据库地址,可以是Ip或者域名
    port := 3306 //数据库端口
    Dbname := "tizi365" //数据库名

    //通过前面的数据库参数,拼接MYSQL DSN, 其实就是数据库连接串(数据源名称)
    //MYSQL dsn格式: {username}:{password}@tcp({host}:{port})/{Dbname}?charset=utf8&parseTime=True&loc=Local
    //类似{username}使用花括号包着的名字都是需要替换的参数
    dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", username, password, host, port, Dbname)
    //连接MYSQL
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        panic("连接数据库失败, error=" + err.Error())
    }

    //定义一个用户,并初始化数据
    u := User{
        Username:"tizi365",
        Password:"123456",
        CreateTime:time.Now().Unix(),
    }

    //插入一条用户数据
    //下面代码会自动生成SQL语句:INSERT INTO `users` (`username`,`password`,`createtime`) VALUES ('tizi365','123456','1540824823')
    if err := db.Create(&u).Error; err != nil {
        fmt.Println("插入失败", err)
        return
    }

    //查询并返回第一条数据
    //定义需要保存数据的struct变量
    u = User{}
    //自动生成sql: SELECT * FROM `users`  WHERE (username = 'tizi365') LIMIT 1
    result := db.Where("username = ?", "tizi365").First(&u)
    if errors.Is(result.Error, gorm.ErrRecordNotFound) {
        fmt.Println("找不到记录")
        return
    }
    //打印查询到的数据
    fmt.Println(u.Username,u.Password)

    //更新
    //自动生成Sql: UPDATE `users` SET `password` = '654321'  WHERE (username = 'tizi365')
    db.Model(&User{}).Where("username = ?", "tizi365").Update("password", "654321")

    //删除
    //自动生成Sql: DELETE FROM `users`  WHERE (username = 'tizi365')
    db.Where("username = ?", "tizi365").Delete(&User{})
}

3.gorm的错误处理

gorm库在执行数据库操作的时候,如果出现错误,则会更新gorm.DB的Error属性,Error属性默认nil,因此在执行数据库操作后检测下Error属性是否为nil即可知道有没有错误发生。

//插入记录后,检测Error是否为nil
if err := db.Create(u).Error; err != nil {
    fmt.Println("插入失败", err)
    return
}

标签:username,users,数据库,tizi365,golang,一库,MYSQL,go,gorm
来源: https://www.cnblogs.com/davis12/p/16364944.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有