From dc9eddc6383eaccd64f3d2d0b2600fbec8b9f957 Mon Sep 17 00:00:00 2001 From: yanzuoguang Date: Sat, 8 Nov 2025 19:44:48 +0800 Subject: [PATCH] =?UTF-8?q?feat(repo):=20=E6=B7=BB=E5=8A=A0SQL=E8=AF=AD?= =?UTF-8?q?=E5=8F=A5=E6=89=A7=E8=A1=8C=E6=97=A5=E5=BF=97=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增LoggedStmt结构体封装sql.Stmt以支持日志记录 - 在SQL命令加载时注入日志功能 - 实现ExecContext、QueryContext和QueryRowContext方法的日志记录- 修改GetCategoryPageCount字段类型为*LoggedStmt - 调整scanProduct和scanProducts函数实现以提高代码可读性- 新增getSQLQuery函数用于读取SQL命令文件内容 -为多个SQL执行方法添加调试日志输出 --- .../sportsstore/models/repo/sql_loader.go | 15 +++++- .../sportsstore/models/repo/sql_logger.go | 51 ++++++++++++++++++ .../sportsstore/models/repo/sql_repo.go | 2 +- .../sportsstore/models/repo/sql_scan.go | 29 +++++----- 32-platform/sportsstore/store.db | Bin 0 -> 12288 bytes 5 files changed, 79 insertions(+), 18 deletions(-) create mode 100644 32-platform/sportsstore/models/repo/sql_logger.go create mode 100644 32-platform/sportsstore/store.db 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 0000000000000000000000000000000000000000..263d944d7f6256c00d312ed7340c0fd039639c71 GIT binary patch literal 12288 zcmeI&&yM3X7yxiP8Pe@&X-C?XMhLC+4XZ^{X$qsMmO)5}rX}rGEuA6lYPCmC?6hXm zI7-}sz=c1z6)yl!z>zoLLEy?A2_Aqi9d(D*iVHX3v((zP9e-bb?Zv5QA5XMZ5Sx4@ zEOgi&Zbolf&I=+p{r}u#w^i-U-R94%`CIc>tf-Ix z36KB@kN^pg011!)36KB@kN^q%y992zF5B-fRZ-L(m%TPKQKa$)ciH_X_~;=oGLze) z+W*%Z9&7&6{Gn-@Z#MpD{M5K=^stKx36KB@kN^pg011!)36KB@kidUV;Jv!X+GpJ9 zB|2Te_4^o`LzBpMmf&_#9)Z+iWm4HL>{?1Cp_<_C{CIN9V{d=J`J?qpq_EjB9%^-tj9QdwtB^nH5s6R|CAib|#`ryr<5?qvPY_cA@Yvd~rSO@OQo)?qC?jYkiZa zDhIq`Q4F6ai9lr)JJu?Zm??&jao3H93`7FftfQsV^~>+De1GbC?Ea9~t~cY*6G<`{ z4g9vqHaSZu^ydmhD&bS57fb7OJ6~>oZ6}V$4*Ys;qGR<*m8-=Q5mrUE%A%Sdi(*+t m#FG@=N7upL;2zsQtvh2;ic23Z4Bk}rO`s@b_yEA9{LY`n>MpGS literal 0 HcmV?d00001