diff --git a/32-platform/sportsstore/models/repo/sql_loader.go b/32-platform/sportsstore/models/repo/sql_loader.go index d1f5adf..dd8c4a9 100644 --- a/32-platform/sportsstore/models/repo/sql_loader.go +++ b/32-platform/sportsstore/models/repo/sql_loader.go @@ -36,7 +36,8 @@ func loadCommands(db *sql.DB, config config.Configuration, logger logging.Logger commandName := commandType.Field(i).Name logger.Debugf("Loading SQL command: %v", commandName) stmt := prepareCommand(db, commandName, config, logger) - commandVal.Field(i).Set(reflect.ValueOf(stmt)) + loggedStmt := NewLoggedStmt(stmt, getSQLQuery(commandName, config), logger) + commandVal.Field(i).Set(reflect.ValueOf(loggedStmt)) } return commands } @@ -56,3 +57,15 @@ func prepareCommand(db *sql.DB, command string, config config.Configuration, log } return statement } + +func getSQLQuery(command string, config config.Configuration) string { + fileName, found := config.GetString("sql:commands:" + command) + if !found { + return "" + } + data, err := os.ReadFile(fileName) + if err != nil { + return "" + } + return string(data) +} diff --git a/32-platform/sportsstore/models/repo/sql_logger.go b/32-platform/sportsstore/models/repo/sql_logger.go new file mode 100644 index 0000000..29a9605 --- /dev/null +++ b/32-platform/sportsstore/models/repo/sql_logger.go @@ -0,0 +1,51 @@ +package repo + +import ( + "context" + "database/sql" + "platform/logging" +) + +// LoggedStmt 包装sql.Stmt以添加日志功能 +type LoggedStmt struct { + *sql.Stmt + query string + logger logging.Logger +} + +// LoggedRows 包装sql.Rows +type LoggedRows struct { + *sql.Rows +} + +// LoggedRow 包装sql.Row +type LoggedRow struct { + *sql.Row +} + +// NewLoggedStmt 创建一个新的LoggedStmt实例 +func NewLoggedStmt(stmt *sql.Stmt, query string, logger logging.Logger) *LoggedStmt { + return &LoggedStmt{ + Stmt: stmt, + query: query, + logger: logger, + } +} + +// ExecContext 记录并执行ExecContext +func (ls *LoggedStmt) ExecContext(ctx context.Context, args ...interface{}) (sql.Result, error) { + ls.logger.Debugf("Executing SQL: %s, params: %v", ls.query, args) + return ls.Stmt.ExecContext(ctx, args...) +} + +// QueryContext 记录并执行QueryContext +func (ls *LoggedStmt) QueryContext(ctx context.Context, args ...interface{}) (*sql.Rows, error) { + ls.logger.Debugf("Executing SQL: %s, params: %v", ls.query, args) + return ls.Stmt.QueryContext(ctx, args...) +} + +// QueryRowContext 记录并执行QueryRowContext +func (ls *LoggedStmt) QueryRowContext(ctx context.Context, args ...interface{}) *sql.Row { + ls.logger.Debugf("Executing SQL: %s, params: %v", ls.query, args) + return ls.Stmt.QueryRowContext(ctx, args...) +} diff --git a/32-platform/sportsstore/models/repo/sql_repo.go b/32-platform/sportsstore/models/repo/sql_repo.go index c66eced..5276d36 100644 --- a/32-platform/sportsstore/models/repo/sql_repo.go +++ b/32-platform/sportsstore/models/repo/sql_repo.go @@ -24,5 +24,5 @@ type SqlCommands struct { GetPage, GetPageCount, GetCategoryPage, - GetCategoryPageCount *sql.Stmt + GetCategoryPageCount *LoggedStmt } diff --git a/32-platform/sportsstore/models/repo/sql_scan.go b/32-platform/sportsstore/models/repo/sql_scan.go index 1e027b1..8d38255 100644 --- a/32-platform/sportsstore/models/repo/sql_scan.go +++ b/32-platform/sportsstore/models/repo/sql_scan.go @@ -5,23 +5,20 @@ import ( "sportstore/models" ) -func scanProducts(rows *sql.Rows) (products []models.Product, err error) { - products = make([]models.Product, 0, 10) - for rows.Next() { - p := models.Product{Category: &models.Category{}} - if err = rows.Scan(&p.ID, &p.Name, &p.Description, &p.Price, - &p.Category.ID, &p.Category.CategoryName); err == nil { - products = append(products, p) - } else { - return - } - } +func scanProduct(row *sql.Row) (p models.Product, err error) { + p.Category = &models.Category{} + err = row.Scan(&p.ID, &p.Name, &p.Description, &p.Price, &p.Category.ID, &p.Category.CategoryName) return } -func scanProduct(row *sql.Row) (p models.Product, err error) { - p = models.Product{Category: &models.Category{}} - err = row.Scan(&p.ID, &p.Name, &p.Description, &p.Price, - &p.Category.ID, &p.Category.CategoryName) - return p, err +func scanProducts(rows *sql.Rows) (results []models.Product, err error) { + for rows.Next() { + p := models.Product{} + p.Category = &models.Category{} + if err = rows.Scan(&p.ID, &p.Name, &p.Description, &p.Price, &p.Category.ID, &p.Category.CategoryName); err != nil { + return + } + results = append(results, p) + } + return } diff --git a/32-platform/sportsstore/store.db b/32-platform/sportsstore/store.db new file mode 100644 index 0000000..263d944 Binary files /dev/null and b/32-platform/sportsstore/store.db differ