1
0
Fork 1
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:
rook1e 2024-03-13 13:45:59 +08:00
parent 340f3be641
commit 428210efa0
No known key found for this signature in database
GPG key ID: C63289D731719BC0
3 changed files with 29 additions and 34 deletions

View file

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

View file

@ -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 {

View file

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