gorm操作数据库

本文介绍了GORM,一种用于Go语言的对象关系映射框架,概述了其原理、安装方法、数据库连接、自动迁移以及基本的CRUD操作。
摘要由CSDN通过智能技术生成

一,什么是gorm

1,orm

Object-Relationl Mapping

ORM(对象关系映射)是一种编程技术,用于在关系型数据库和面向对象编程语言之间建立映射关系。ORM允许开发人员使用面向对象的方式操作数据库,而不需要直接编写SQL语句。它将数据库表格和记录映射为对象和类,使得开发人员可以使用面向对象的思维和技术来处理数据。

ORM的主要目标是简化数据库操作和提高开发效率。它提供了一组API或工具,用于执行常见数据库操作,例如查询、插入、更新和删除数据。通过ORM,开发人员可以使用编程语言本身的特性(如类、对象、继承、多态等)来表示数据库结构和操作,而不必关心底层数据库的细节。

ORM框架使得开发人员可以更加专注于业务逻辑和对象模型的设计,而无需直接与数据库操作和SQL语句打交道,从而简化了开发过程并提高了开发效率。

2,gorm

每一门语言都有对应的ORM框架

python:SQLAlchemy  DjiangoORM

java:Hibernate  Mybatis

golang:gorm


 

二,安装 gorm

## 必须安装gorm
go get -u gorm.io/gorm     
## 安装相应的数据库驱动。GORM 官方支持的数据库类型有: MySQL, PostgreSQL, SQlite, SQL Server
go get -u gorm.io/driver/mysql

三,gorm连接数据库

GORM 官方支持的数据库类型有: MySQL, PostgreSQL, SQlite, SQL Server。以MySQL为例

1,连接MySQL

package main

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

var DB *gorm.DB

func init() {
	//root:账号(改为自己的)
	//123456:数据库密码(改为自己的)
	//tcp(127.0.0.1):数据库所在的主机和端口号(改为自己的)
	//test:数据库名字(改为自己的)
	//charset:设置连接的字符集为UTF-8。通过使用UTF-8字符集,可以支持更广泛的字符范围和多语言支持。
	//parseTime:告诉MySQL驱动程序将数据库中的时间戳数据类型解析为Go时间类型。这样可以方便在Go代码中处理时间数据。
	//loc:设置时区为本地时区。这可以确保在处理时间时根据本地时区进行适当的转换。

	dataSourceName := "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True&loc=Local"
	//db, err := gorm.Open(mysql.Open(dataSourceName))

	//跳过默认事务,为了确保数据一致性,GORM会在事务里执行写入操作,如果没有这方面要求,可以在初始化时禁用
	db, err := gorm.Open(mysql.Open(dataSourceName), &gorm.Config{
		SkipDefaultTransaction: true,
	})

	checkError(err) //检查错误
	DB = db
	fmt.Println("连接成功:", DB)
}

func main() {

}

func checkError(err error) {
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
}

2,自动迁移

在GORM中,AutoMigrate用于自动创建或更新数据库表结构以匹配GORM模型的定义。

当您在GORM中定义了一个模型(Model),它对应于数据库中的一张表,AutoMigrate方法可以自动执行数据库迁移操作,以确保数据库表结构与模型定义一致。

在GORM中使用AutoMigrate方法:

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

type User struct {
    gorm.Model
    Name  string
    Email string
}

func main() {
    dsn := "user:password@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("Failed to connect to database")
    }

    // 自动创建或更新数据库表
    err = db.AutoMigrate(&User{})
    if err != nil {
        panic("Failed to migrate database")
    }

    // 进行其他数据库操作...
}

四,gorm相关操作CRUD

package main

import(
	"fmt"
	"gorm.io/gorm"
	"gorm.io/driver/mysql"
	"os"
)
type User struct{ //User users
	Id int //id 主键
	Name string `gorm:"column:names"`//指定特定的
	Age int
	City string//city
	//如果表里有多个字段,只会查询到结构体定义的字段
}
func(User)TableName()string{
	return "user"
}

func main()  {
	//与数据库连接的信息
	dataSourceName:="root:123456@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True"
	//建立连接
	client,err:=gorm.Open(mysql.Open(dataSourceName),nil)//第二个参数是一些选项配置
	checkError(err)//检查错误

	//查Retrieve
	//1多个
	var users []User
	client.Select("id,names").Where("city=?","北京").Find(&users)//使用问号更加安全,防止sql注入攻击
	//client.where("city="+"北京")//也可以使用"+",不安全
	if len(users)>0{
		fmt.Println(users)
	}else{
		fmt.Println("无数据")
	}
	//2单个
	var user User
	client.Select("names").Where("city=?","上海").First(&user)//第一个
	fmt.Println(user)
	client.Select("names").Where("city=?","广州").Last(&user)//最后一个
	fmt.Println(user)
	client.Select("names,city").Where("city=?","北京").Limit(1).Take(&user)//随机取一个
	fmt.Println(user)


	//增Create
	user2:=User{
		Id:21,
		Name:"alice",
		Age:23,
		City:"南京",
	}
	client.Create(user2)
	//client.CreateInBatches()//可使用插入多条数据


	//改Update
	//client.Model(User{}).Update("city","西安")//表内所有"city"都将改为"西安"
	//client.Model(User{}).Where("id=?",21).Update("city","西安")//Model指定表名,User的函数TableName
	client.Model(User{}).Where("id=?",21).Updates(//修改一行数据
		map[string]interface{}{"city":"成都","age":17},//末尾有逗号
	)


	//删Delete
	client.Model(User{}).Where("id=?",1).Delete(User{})
	//client.Where("id=?",1).Delete(User{})//等同以上
}

func checkError(err error){
	if err!=nil{
		fmt.Println(err)
		os.Exit(1)
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值