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))
}
上一篇:Gorm 日期格式错误


下一篇:GORM 增删改查指南