gorm 中如何每天创建新表?

yzhengwei · 2023-01-01 15:32:52 · 4651 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2023-01-01 15:32:52 的主题,其中的信息可能已经有所发展或是发生改变。

使用 gin + gorm,会按时每天创建新表或通过前端提交的信息创建新表,这些表结构不变,只是表名不同,怎么在 gorm 里创建关系映射呢?


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

4651 次点击  
加入收藏 微博
8 回复  |  直到 2023-01-13 18:38:18
6133302
6133302 · #1 · 2年之前

https://gorm.io/zh_CN/docs/conventions.html 实现Tabler接口即可,再搞个定时任务每天执行migrate

xwszt
xwszt · #2 · 2年之前

把表结构创建语句导出sql,然后在定时任务中执行这个sql就行了呀

楼主的意思我明白,我个人认为工作就是完成任务,怎么简单怎么来

yzhengwei
yzhengwei · #3 · 2年之前

我知道创建的时候可以用原始SQL或者migrate来创建,但是使用的时候不是需要映射到 struct 嘛,如果每天创建一个同样结构的新表,关系映射的时候如何处理?gorm查询的时候可以通过传递表名来查询不同表嘛?

zzustu
zzustu · #4 · 2年之前
type Daily struct {
    ID   int64  `json:"id"   gorm:"column:id;primaryKey"`
    Name string `json:"name" gorm:"column:name"`
}

// TodayName 今天的表名
func (d Daily) TodayName() func(*gorm.DB) *gorm.DB {
    return d.DateName(time.Now())
}

// TomorrowName 明天的表名
func (d Daily) TomorrowName() func(*gorm.DB) *gorm.DB {
    date := time.Now().Add(24 * time.Hour)
    return d.DateName(date)
}

// DateName 根据时间生成对应的表名,表名规则:daily_yyyy_MM_dd
func (Daily) DateName(date time.Time) func(*gorm.DB) *gorm.DB {
    return func(tx *gorm.DB) *gorm.DB {
        name := date.Format("daily_2006_01_02")
        return tx.Table(name)
    }
}

// 定时任务提前一天建好表
var daily1 Daily
db.Scopes(daily1.TomorrowName()).AutoMigrate(&daily1)

// 查询一条今日数据
var daily2 Daily
db.Scopes(daily2.TodayName()).First(&daily2)
wwhai
wwhai · #5 · 2年之前

我更愿意用crontab任务

cy422396350
cy422396350 · #6 · 2年之前
xwsztxwszt #2 回复

把表结构创建语句导出sql,然后在定时任务中执行这个sql就行了呀 楼主的意思我明白,我个人认为工作就是完成任务,怎么简单怎么来

太6了,完美解决,没bug

alphayan
alphayan · #7 · 2年之前
zzustuzzustu #4 回复

```go type Daily struct { ID int64 `json:"id" gorm:"column:id;primaryKey"` Name string `json:"name" gorm:"column:name"` } // TodayName 今天的表名 func (d Daily) TodayName() func(*gorm.DB) *gorm.DB { return d.DateName(time.Now()) } // TomorrowName 明天的表名 func (d Daily) TomorrowName() func(*gorm.DB) *gorm.DB { date := time.Now().Add(24 * time.Hour) return d.DateName(date) } // DateName 根据时间生成对应的表名,表名规则:daily_yyyy_MM_dd func (Daily) DateName(date time.Time) func(*gorm.DB) *gorm.DB { return func(tx *gorm.DB) *gorm.DB { name := date.Format("daily_2006_01_02") return tx.Table(name) } } // 定时任务提前一天建好表 var daily1 Daily db.Scopes(daily1.TomorrowName()).AutoMigrate(&daily1) // 查询一条今日数据 var daily2 Daily db.Scopes(daily2.TodayName()).First(&daily2) ```

高手

yzhengwei
yzhengwei · #8 · 2年之前
zzustuzzustu #4 回复

```go type Daily struct { ID int64 `json:"id" gorm:"column:id;primaryKey"` Name string `json:"name" gorm:"column:name"` } // TodayName 今天的表名 func (d Daily) TodayName() func(*gorm.DB) *gorm.DB { return d.DateName(time.Now()) } // TomorrowName 明天的表名 func (d Daily) TomorrowName() func(*gorm.DB) *gorm.DB { date := time.Now().Add(24 * time.Hour) return d.DateName(date) } // DateName 根据时间生成对应的表名,表名规则:daily_yyyy_MM_dd func (Daily) DateName(date time.Time) func(*gorm.DB) *gorm.DB { return func(tx *gorm.DB) *gorm.DB { name := date.Format("daily_2006_01_02") return tx.Table(name) } } // 定时任务提前一天建好表 var daily1 Daily db.Scopes(daily1.TomorrowName()).AutoMigrate(&daily1) // 查询一条今日数据 var daily2 Daily db.Scopes(daily2.TodayName()).First(&daily2) ```

感谢大佬

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传