芯が強い人になるESTJ-A

# 2023-GO-GORM框架

IT開発 Tags: 无标签 阅读: 178

Gorm框架

https://gorm.io/zh_CN/docs/index.html

The fantastic ORM library for Golang aims to be developer friendly.

特性
全功能 ORM
关联 (Has One,Has Many,Belongs To,Many To Many,多态,单表继承)
Create,Save,Update,Delete,Find 中钩子方法
支持 Preload、Joins 的预加载
事务,嵌套事务,Save Point,Rollback To Saved Point
Context、预编译模式、DryRun 模式
批量插入,FindInBatches,Find/Create with Map,使用 SQL 表达式、Context Valuer 进行 CRUD
SQL 构建器,Upsert,数据库锁,Optimizer/Index/Comment Hint,命名参数,子查询
复合主键,索引,约束
Auto Migration
自定义 Logger
灵活的可扩展插件 API:Database Resolver(多数据库,读写分离)、Prometheus…
每个特性都经过了测试的重重考验
开发者友好

安装包

go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite
go get -u gorm.io/driver/mysql

如何连接到mysql数据库,如果是其他数据库,请参考官方文档

https://gorm.io/zh_CN/docs/connecting_to_the_database.html

package main

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

func main() {

    //连接到数据库
    // 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
    username := "mall"
    password := "?"
    host := "rm-uf6t9m0yx22dxrya5no.mysql.rds.aliyuncs.com"
    port := 3306
    dbname := "mall"
    //port端口是数字所以是%d
    dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local", username, password, host, port, dbname)
    //dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

    //测试是否连接数据库成功?
    if err != nil {
        panic("数据库连接遇到问题,失败了,失败原因" + err.Error())
    }
    fmt.Println(db)

}

封装一下数据库conn

conn.go
package db

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

func DBConnection() *gorm.DB {

    //连接到数据库
    // 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
    username := "mall"
    password := "??"
    host := "rm-uf6t9m0yx22dxrya5no.mysql.rds.aliyuncs.com"
    port := 3306
    dbname := "mall"
    //port端口是数字所以是%d
    dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local", username, password, host, port, dbname)
    //dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

    //测试是否连接数据库成功?
    if err != nil {
        panic("数据库连接遇到问题,失败了,失败原因" + err.Error())
    }
    fmt.Println(db)
    //返回值是啥?db
    //db *DB, err error
    return db

}


直接利用代码中的struct,新建数据库表

截屏2023-03-19 16.49.29.jpg
截屏2023-03-19 16.49.39.jpg

package main

import (
    "Gorm/db"
    "time"
)

type User struct {
    //PY key,主键设定,自动增长,名字必须叫ID
    ID         int64
    UserName   string
    Avatar     string
    Password   string
    Email      string
    Age        uint8
    Amount     float32
    Birthday   time.Time
    CreateTime time.Time
    UpdateTime time.Time
}

func main() {
    //1获取连接
    db := db.DBConnection()
    //2注册生成表
    err := db.AutoMigrate(&User{})
    if err != nil {
        fmt.Println("新建table出现问题,", err)
    } else {
        fmt.Println("数据库表新建成功")
    }
}

截屏2023-03-19 16.54.22.jpg

用户注册就是DB里面create