Gorm框架中有关操作数据库表

GORM框架有关Table的语句

1、根据表名查看当前表在数据库中是否存在

Gorm.io/gorm 包下
exist := db.DB.Migrator().HasTable(tableName)
github.com/jinzhu/gorm包下
exist := db.hasTable(tableName)  

⚠️ 不仅判断不同,许多方法均有一定差别,官方文档如下
Gorm.io/gorm
github.com/jinzhu/gorm

2、根据数据库中的表创建相同结构、数据的表,表名不相同

//创建新的应用日志表、仅表结构相同
  log_monitor_backend_logs_xyx_srv
		// BackendLog表名
		var bl models.BackendLog
		BackendLogTableName := bl.TableName() + "_" + name
		// sql 语句注意字段间空格
		if err = tx.Exec("create table " + BackendLogTableName + " (like " + bl.TableName() + " including all)").Error; err != nil {
			err = fmt.Errorf("gorm.DB.CreateTabel: %w", err)
			//事务回滚
			tx.Rollback()
			return
		}
//具体方法如下
		//创建一个与test表结构相同的表
		//复制表结构
		create table testb (like test)
		//复制表结构和数据
		create table testa as select * from test

		//附加参数 (仅结构上复制)
		create table testd (like test including all);
	 
		including default
		including constraints
		including indexes
		including storage
		including comments
		including all		---把所有属性都复制过去

3、从不同名表中获取数据,可封装到相同结构体当中

type UserInfos struct {
	Id                        int             `gorm:"column:id;default:" json:"id" form:"id"`
	CreateAt                  time.Time       `gorm:"column:create_at;default:" json:"create_at" form:"create_at"`
	UpdateAt                  time.Time       `gorm:"column:update_at;default:" json:"update_at" form:"update_at"`
	GameId                    int             `gorm:"column:game_id;default:" json:"game_id" form:"game_id"`
	UserId                    int             `gorm:"column:user_id;default:" json:"user_id" form:"user_id"`
	UserName                  string          `gorm:"column:user_name;default:" json:"user_name" form:"user_name"`
	Age                       int             `gorm:"column:age;default:" json:"age" form:"age"`
	Sex                       int             `gorm:"column:sex;default:" json:"sex" form:"sex"`
	Hobby                     json.RawMessage `gorm:"column:hobby;default:" json:"hobby" form:"hobby"`
	DefaultContactReceiveFlag bool            `gorm:"column:default_contact_receive_flag;default:" json:"default_contact_receive_flag" form:"default_contact_receive_flag"`
}

func (u UserInfos) TableName() string {
	return "user_infos"
}

// 根据时间查找数据信息
func FindUserInfosByTime(start time.Time, end time.Time, db *gorm.DB) ([]StructModel.UserInfos, int, error) {
	userInfos := make([]StructModel.UserInfos, 0, 5)
	var count int
	//从不同表名中获取数据,封装到相同结构体当中
	// db.Table() 操作哪一张表
	if e := db.Table("user_infos_xyx_log").Where("create_at between ? and ?", start, end).Find(&userInfos).Count(&count).Error; e != nil {
		return []StructModel.UserInfos{}, count, e
	}
	return userInfos, count, nil
}
//数据库使用 postgres,不同数据库,db连接不同,请自行连接
// 不同表名,相同结构的表能够封装到 相同的结构体当中
func TestFindUserInfosByTime(t *testing.T) {
	//连接本地数据库
	db, err := gorm.Open("postgres", "host=xxx port=xxx user=xxx dbname=xxx sslmode=disable password=xxx")
	if err != nil {
		t.Log(err)
	}
	defer db.Close()

	start := "2021-06-04"
	parse, err := time.Parse("2006-01-02", start)
	if err != nil{
		t.Log(err)
		return
	}
	end := time.Now()
	infos, count, err := FindUserInfosByTime(parse, end, db)

	if err != nil{
		t.Log(err)
	}
	t.Log(count)
	t.Log(len(infos))
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用 GORM 框架,可以使用 Go 语言的协程(goroutine)来实现并发操作。下面是一个示例: ```go package main import ( "fmt" "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" ) type User struct { ID int Name string } func main() { db, err := gorm.Open("mysql", "user:password@tcp(127.0.0.1:3306)/database?charset=utf8mb4&parseTime=True&loc=Local") if err != nil { panic("failed to connect database") } defer db.Close() // 创建一个协程来执行查询操作 go func() { var user User db.First(&user, 1) fmt.Println(user) }() // 创建另一个协程来执行插入操作 go func() { newUser := User{Name: "Alice"} db.Create(&newUser) }() // 等待一段时间,以确保协程有足够的时间执行 time.Sleep(time.Second) // 查询所有用户 var users []User db.Find(&users) fmt.Println(users) } ``` 在上面的示例,我们使用了两个协程来执行数据库操作。第一个协程执行了查询操作,第二个协程执行了插入操作。通过使用协程,我们可以并发地执行这些操作,提高程序的性能。 需要注意的是,在使用协程时,我们需要确保数据库连接是线程安全的。在上面的示例,我们使用了 `defer db.Close()` 来关闭数据库连接,以确保资源的释放。另外,为了确保协程有足够的时间执行,我们使用了 `time.Sleep(time.Second)` 来进行等待。 当然,具体的实现方式可能因为业务需求的不同而有所差异,上述示例仅供参考。在实际使用,你可以根据自己的需求来选择合适的并发方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值