From 2943d0f839add5b7cbf89948afe30fc05332e83c Mon Sep 17 00:00:00 2001 From: yanzuoguang Date: Sat, 8 Nov 2025 17:56:58 +0800 Subject: [PATCH] =?UTF-8?q?feat(repo):=20=E6=B7=BB=E5=8A=A0=E4=BA=A7?= =?UTF-8?q?=E5=93=81=E5=92=8C=E5=88=86=E7=B1=BB=E7=9A=84=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E6=9F=A5=E8=AF=A2=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增获取单个产品的 SQL 查询语句 - 新增获取所有产品的 SQL 查询语句 - 新增获取所有分类的 SQL 查询语句- 实现产品和分类数据的扫描解析逻辑 - 在 SqlRepository 中添加对应的数据访问方法- 支持通过 ID 查询特定产品信息 - 支持联表查询产品及其所属分类信息 --- .../models/repo/sql_basic_method.go | 46 +++++++++++++++++++ .../sportsstore/models/repo/sql_scan.go | 27 +++++++++++ .../sportsstore/sql/get_categories.sql | 3 ++ 32-platform/sportsstore/sql/get_product.sql | 10 ++++ 32-platform/sportsstore/sql/get_products.sql | 10 ++++ 5 files changed, 96 insertions(+) create mode 100644 32-platform/sportsstore/models/repo/sql_basic_method.go create mode 100644 32-platform/sportsstore/models/repo/sql_scan.go create mode 100644 32-platform/sportsstore/sql/get_categories.sql create mode 100644 32-platform/sportsstore/sql/get_product.sql create mode 100644 32-platform/sportsstore/sql/get_products.sql diff --git a/32-platform/sportsstore/models/repo/sql_basic_method.go b/32-platform/sportsstore/models/repo/sql_basic_method.go new file mode 100644 index 0000000..4ab40c0 --- /dev/null +++ b/32-platform/sportsstore/models/repo/sql_basic_method.go @@ -0,0 +1,46 @@ +package repo + +import "sportstore/models" + +func (repo *SqlRepository) GetProduct(id int) (p models.Product) { + row := repo.Commands.GetProduct.QueryRowContext(repo.Context, id) + if row.Err() == nil { + var err error + if p, err = scanProduct(row); err != nil { + repo.Logger.Panicf("Cannot scan data product: %v ", err.Error()) + } + } else { + repo.Logger.Panicf("Cannot exec GetProduct command: %v ", row.Err().Error()) + } + return +} + +func (repo *SqlRepository) GetProducts() (results []models.Product) { + rows, err := repo.Commands.GetProducts.QueryContext(repo.Context) + if err == nil { + if results, err = scanProducts(rows); err != nil { + repo.Logger.Panicf("Cannot scan data products: %v ", err.Error()) + return + } + } else { + repo.Logger.Panicf("Cannot exec GetProducts command: %v ", err.Error()) + } + return +} + +func (repo *SqlRepository) GetCategories() []models.Category { + results := make([]models.Category, 0, 10) + rows, err := repo.Commands.GetCategories.QueryContext(repo.Context) + if err == nil { + for rows.Next() { + c := models.Category{} + if err := rows.Scan(&c.ID, &c.CategoryName); err != nil { + repo.Logger.Panicf("Cannot scan data category: %v ", err.Error()) + } + results = append(results, c) + } + } else { + repo.Logger.Panicf("Cannot exec GetCategories command: %v ", err.Error()) + } + return results +} diff --git a/32-platform/sportsstore/models/repo/sql_scan.go b/32-platform/sportsstore/models/repo/sql_scan.go new file mode 100644 index 0000000..1e027b1 --- /dev/null +++ b/32-platform/sportsstore/models/repo/sql_scan.go @@ -0,0 +1,27 @@ +package repo + +import ( + "database/sql" + "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 + } + } + 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 +} diff --git a/32-platform/sportsstore/sql/get_categories.sql b/32-platform/sportsstore/sql/get_categories.sql new file mode 100644 index 0000000..a006c7f --- /dev/null +++ b/32-platform/sportsstore/sql/get_categories.sql @@ -0,0 +1,3 @@ +SELECT Categories.Id, Categories.Name +FROM Categories +ORDER BY Categories.Id \ No newline at end of file diff --git a/32-platform/sportsstore/sql/get_product.sql b/32-platform/sportsstore/sql/get_product.sql new file mode 100644 index 0000000..002c474 --- /dev/null +++ b/32-platform/sportsstore/sql/get_product.sql @@ -0,0 +1,10 @@ +SELECT Products.Id, + Products.Name, + Products.Description, + Products.Price AS ProductPrice, + Categories.Id AS CategoryId, + Categories.Name AS CategoryName +FROM Products, + Categories +WHERE Products.Category = Categories.Id + AND Products.Id = ? \ No newline at end of file diff --git a/32-platform/sportsstore/sql/get_products.sql b/32-platform/sportsstore/sql/get_products.sql new file mode 100644 index 0000000..2517821 --- /dev/null +++ b/32-platform/sportsstore/sql/get_products.sql @@ -0,0 +1,10 @@ +SELECT Products.Id, + Products.Name, + Products.Description, + Products.Price AS ProductPrice, + Categories.Id AS CategoryId, + Categories.Name AS CategoryName +FROM Products, + Categories +WHERE Products.Category = Categories.Id +ORDER BY Products.Id \ No newline at end of file