mirror of
https://github.com/0x2E/fusion.git
synced 2025-06-08 05:27:15 +09:00
fix: error when creating idx_guid in items table
This commit is contained in:
parent
340f3be641
commit
428210efa0
3 changed files with 29 additions and 34 deletions
|
@ -10,16 +10,16 @@ type Item struct {
|
|||
ID uint `gorm:"primarykey"`
|
||||
CreatedAt time.Time
|
||||
UpdatedAt time.Time
|
||||
DeletedAt soft_delete.DeletedAt `gorm:"uniqueIndex:guid"`
|
||||
DeletedAt soft_delete.DeletedAt `gorm:"uniqueIndex:idx_guid"`
|
||||
|
||||
Title *string `gorm:"title"`
|
||||
GUID *string `gorm:"guid;uniqueIndex:guid"`
|
||||
GUID *string `gorm:"guid;uniqueIndex:idx_guid"`
|
||||
Link *string `gorm:"link"`
|
||||
Content *string `gorm:"content"`
|
||||
PubDate *time.Time `gorm:"pub_date"`
|
||||
Unread *bool `gorm:"unread;default:true;index"`
|
||||
Bookmark *bool `gorm:"bookmark;default:false;index"`
|
||||
|
||||
FeedID uint `gorm:"feed_id;uniqueIndex:guid"`
|
||||
FeedID uint `gorm:"feed_id;uniqueIndex:idx_guid"`
|
||||
Feed Feed
|
||||
}
|
||||
|
|
|
@ -63,9 +63,10 @@ func (i Item) Get(id uint) (*model.Item, error) {
|
|||
}
|
||||
|
||||
func (i Item) Creates(items []*model.Item) error {
|
||||
// limit batchSize to fix 'too many SQL variable' error
|
||||
return i.db.Clauses(clause.OnConflict{
|
||||
DoNothing: true,
|
||||
}).Create(items).Error
|
||||
}).CreateInBatches(items, 5).Error
|
||||
}
|
||||
|
||||
func (i Item) Update(id uint, item *model.Item) error {
|
||||
|
|
54
repo/repo.go
54
repo/repo.go
|
@ -22,48 +22,43 @@ func Init() {
|
|||
}
|
||||
DB = conn
|
||||
|
||||
if err := migrage(); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
if err := registerCallback(); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
if conf.Debug {
|
||||
DB = DB.Debug()
|
||||
}
|
||||
migrage()
|
||||
registerCallback()
|
||||
}
|
||||
|
||||
func migrage() error {
|
||||
func migrage() {
|
||||
// v0.4.0 adds unique index (guid, feed_id, deleted_at).
|
||||
// clear data before AutoMigrate create the unique index.
|
||||
// TODO: remove in v1.0.0
|
||||
if err := DB.Transaction(func(tx *gorm.DB) error {
|
||||
err := tx.Exec("UPDATE items as i1 SET guid = (SELECT link FROM items as i2 WHERE i1.id = i2.id) WHERE guid = '' OR guid IS NULL").Error
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return tx.Exec("DELETE FROM items WHERE id NOT IN (SELECT MIN(id) FROM items GROUP BY feed_id, deleted_at, guid)").Error
|
||||
}); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// FIX: gorm not auto drop index and change 'not null'
|
||||
if err := DB.AutoMigrate(&model.Feed{}, &model.Group{}, &model.Item{}); err != nil {
|
||||
return err
|
||||
if err := DB.Debug().AutoMigrate(&model.Feed{}, &model.Group{}, &model.Item{}); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
defaultGroup := "Default"
|
||||
if err := DB.Model(&model.Group{}).Where("id = ?", 1).
|
||||
FirstOrCreate(&model.Group{ID: 1, Name: &defaultGroup}).Error; err != nil {
|
||||
return err
|
||||
panic(err)
|
||||
}
|
||||
|
||||
if err := DB.Table("items as i1").Where("guid = '' OR guid is null").UpdateColumn(
|
||||
"guid",
|
||||
DB.Table("items as i2").Select("link").Where("i1.id = i2.id"),
|
||||
).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func registerCallback() error {
|
||||
func registerCallback() {
|
||||
if err := DB.Callback().Query().After("*").Register("convert_error", func(db *gorm.DB) {
|
||||
if errors.Is(db.Error, gorm.ErrRecordNotFound) {
|
||||
db.Error = ErrNotFound
|
||||
}
|
||||
}); err != nil {
|
||||
return err
|
||||
panic(err)
|
||||
}
|
||||
|
||||
if err := DB.Callback().Create().After("*").Register("convert_error", func(db *gorm.DB) {
|
||||
|
@ -71,7 +66,7 @@ func registerCallback() error {
|
|||
db.Error = ErrDuplicatedKey
|
||||
}
|
||||
}); err != nil {
|
||||
return err
|
||||
panic(err)
|
||||
}
|
||||
|
||||
if err := DB.Callback().Update().After("*").Register("convert_error", func(db *gorm.DB) {
|
||||
|
@ -82,7 +77,7 @@ func registerCallback() error {
|
|||
db.Error = ErrDuplicatedKey
|
||||
}
|
||||
}); err != nil {
|
||||
return err
|
||||
panic(err)
|
||||
}
|
||||
|
||||
if err := DB.Callback().Delete().After("*").Register("convert_error", func(db *gorm.DB) {
|
||||
|
@ -93,7 +88,6 @@ func registerCallback() error {
|
|||
db.Error = ErrDuplicatedKey
|
||||
}
|
||||
}); err != nil {
|
||||
return err
|
||||
panic(err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue