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))
}