diff --git a/pkg/common/adapters/database/bun.go b/pkg/common/adapters/database/bun.go index 8cc64e0..c27e2bc 100644 --- a/pkg/common/adapters/database/bun.go +++ b/pkg/common/adapters/database/bun.go @@ -410,6 +410,9 @@ func (b *BunSelectQuery) Scan(ctx context.Context, dest interface{}) (err error) // Execute the main query first err = b.query.Scan(ctx, dest) if err != nil { + // Log SQL string for debugging + sqlStr := b.query.String() + logger.Error("BunSelectQuery.Scan failed. SQL: %s. Error: %v", sqlStr, err) return err } @@ -438,6 +441,9 @@ func (b *BunSelectQuery) ScanModel(ctx context.Context) (err error) { // Execute the main query first err = b.query.Scan(ctx) if err != nil { + // Log SQL string for debugging + sqlStr := b.query.String() + logger.Error("BunSelectQuery.ScanModel failed. SQL: %s. Error: %v", sqlStr, err) return err } @@ -573,15 +579,25 @@ func (b *BunSelectQuery) Count(ctx context.Context) (count int, err error) { // If Model() was set, use bun's native Count() which works properly if b.hasModel { count, err := b.query.Count(ctx) + if err != nil { + // Log SQL string for debugging + sqlStr := b.query.String() + logger.Error("BunSelectQuery.Count failed. SQL: %s. Error: %v", sqlStr, err) + } return count, err } // Otherwise, wrap as subquery to avoid "Model(nil)" error // This is needed when only Table() is set without a model - err = b.db.NewSelect(). + countQuery := b.db.NewSelect(). TableExpr("(?) AS subquery", b.query). - ColumnExpr("COUNT(*)"). - Scan(ctx, &count) + ColumnExpr("COUNT(*)") + err = countQuery.Scan(ctx, &count) + if err != nil { + // Log SQL string for debugging + sqlStr := countQuery.String() + logger.Error("BunSelectQuery.Count (subquery) failed. SQL: %s. Error: %v", sqlStr, err) + } return count, err } @@ -592,7 +608,13 @@ func (b *BunSelectQuery) Exists(ctx context.Context) (exists bool, err error) { exists = false } }() - return b.query.Exists(ctx) + exists, err = b.query.Exists(ctx) + if err != nil { + // Log SQL string for debugging + sqlStr := b.query.String() + logger.Error("BunSelectQuery.Exists failed. SQL: %s. Error: %v", sqlStr, err) + } + return exists, err } // BunInsertQuery implements InsertQuery for Bun @@ -729,6 +751,11 @@ func (b *BunUpdateQuery) Exec(ctx context.Context) (res common.Result, err error } }() result, err := b.query.Exec(ctx) + if err != nil { + // Log SQL string for debugging + sqlStr := b.query.String() + logger.Error("BunUpdateQuery.Exec failed. SQL: %s. Error: %v", sqlStr, err) + } return &BunResult{result: result}, err } @@ -759,6 +786,11 @@ func (b *BunDeleteQuery) Exec(ctx context.Context) (res common.Result, err error } }() result, err := b.query.Exec(ctx) + if err != nil { + // Log SQL string for debugging + sqlStr := b.query.String() + logger.Error("BunDeleteQuery.Exec failed. SQL: %s. Error: %v", sqlStr, err) + } return &BunResult{result: result}, err } diff --git a/pkg/common/adapters/database/gorm.go b/pkg/common/adapters/database/gorm.go index 8711613..1a0f522 100644 --- a/pkg/common/adapters/database/gorm.go +++ b/pkg/common/adapters/database/gorm.go @@ -282,7 +282,15 @@ func (g *GormSelectQuery) Scan(ctx context.Context, dest interface{}) (err error err = logger.HandlePanic("GormSelectQuery.Scan", r) } }() - return g.db.WithContext(ctx).Find(dest).Error + err = g.db.WithContext(ctx).Find(dest).Error + if err != nil { + // Log SQL string for debugging + sqlStr := g.db.ToSQL(func(tx *gorm.DB) *gorm.DB { + return tx.Find(dest) + }) + logger.Error("GormSelectQuery.Scan failed. SQL: %s. Error: %v", sqlStr, err) + } + return err } func (g *GormSelectQuery) ScanModel(ctx context.Context) (err error) { @@ -294,7 +302,15 @@ func (g *GormSelectQuery) ScanModel(ctx context.Context) (err error) { if g.db.Statement.Model == nil { return fmt.Errorf("ScanModel requires Model() to be set before scanning") } - return g.db.WithContext(ctx).Find(g.db.Statement.Model).Error + err = g.db.WithContext(ctx).Find(g.db.Statement.Model).Error + if err != nil { + // Log SQL string for debugging + sqlStr := g.db.ToSQL(func(tx *gorm.DB) *gorm.DB { + return tx.Find(g.db.Statement.Model) + }) + logger.Error("GormSelectQuery.ScanModel failed. SQL: %s. Error: %v", sqlStr, err) + } + return err } func (g *GormSelectQuery) Count(ctx context.Context) (count int, err error) { @@ -306,6 +322,13 @@ func (g *GormSelectQuery) Count(ctx context.Context) (count int, err error) { }() var count64 int64 err = g.db.WithContext(ctx).Count(&count64).Error + if err != nil { + // Log SQL string for debugging + sqlStr := g.db.ToSQL(func(tx *gorm.DB) *gorm.DB { + return tx.Count(&count64) + }) + logger.Error("GormSelectQuery.Count failed. SQL: %s. Error: %v", sqlStr, err) + } return int(count64), err } @@ -318,6 +341,13 @@ func (g *GormSelectQuery) Exists(ctx context.Context) (exists bool, err error) { }() var count int64 err = g.db.WithContext(ctx).Limit(1).Count(&count).Error + if err != nil { + // Log SQL string for debugging + sqlStr := g.db.ToSQL(func(tx *gorm.DB) *gorm.DB { + return tx.Limit(1).Count(&count) + }) + logger.Error("GormSelectQuery.Exists failed. SQL: %s. Error: %v", sqlStr, err) + } return count > 0, err } @@ -456,6 +486,13 @@ func (g *GormUpdateQuery) Exec(ctx context.Context) (res common.Result, err erro } }() result := g.db.WithContext(ctx).Updates(g.updates) + if result.Error != nil { + // Log SQL string for debugging + sqlStr := g.db.ToSQL(func(tx *gorm.DB) *gorm.DB { + return tx.Updates(g.updates) + }) + logger.Error("GormUpdateQuery.Exec failed. SQL: %s. Error: %v", sqlStr, result.Error) + } return &GormResult{result: result}, result.Error } @@ -488,6 +525,13 @@ func (g *GormDeleteQuery) Exec(ctx context.Context) (res common.Result, err erro } }() result := g.db.WithContext(ctx).Delete(g.model) + if result.Error != nil { + // Log SQL string for debugging + sqlStr := g.db.ToSQL(func(tx *gorm.DB) *gorm.DB { + return tx.Delete(g.model) + }) + logger.Error("GormDeleteQuery.Exec failed. SQL: %s. Error: %v", sqlStr, result.Error) + } return &GormResult{result: result}, result.Error }