From 945d371dd29b764d95d5f079efc361a2acc4bbd5 Mon Sep 17 00:00:00 2001 From: yanzuoguang Date: Sat, 8 Nov 2025 18:22:18 +0800 Subject: [PATCH] =?UTF-8?q?feat(repo):=20=E5=AE=9E=E7=8E=B0SQL=E5=AD=98?= =?UTF-8?q?=E5=82=A8=E5=BA=93=E6=9C=8D=E5=8A=A1=E5=B9=B6=E6=9B=BF=E6=8D=A2?= =?UTF-8?q?=E5=86=85=E5=AD=98=E5=AD=98=E5=82=A8=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在配置文件中添加SQL相关配置项,包括连接字符串和SQL命令路径 - 更新go.mod和go.sum文件,添加新的依赖项如sqlite、humanize等 - 注释掉内存存储库注册,启用SQL存储库服务注册 - 新增SqlRepositoryService实现,支持数据库初始化和种子数据加载 - 实现SQL存储库的单次加载和重置逻辑,确保服务启动时正确初始化数据库 --- 32-platform/sportsstore/config.json | 15 +++++++ 32-platform/sportsstore/go.mod | 15 ++++++- 32-platform/sportsstore/go.sum | 23 ++++++++++ 32-platform/sportsstore/mian.go | 3 +- .../sportsstore/models/repo/sql_service.go | 42 +++++++++++++++++++ 5 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 32-platform/sportsstore/models/repo/sql_service.go diff --git a/32-platform/sportsstore/config.json b/32-platform/sportsstore/config.json index ddbb7f6..64554e1 100644 --- a/32-platform/sportsstore/config.json +++ b/32-platform/sportsstore/config.json @@ -12,5 +12,20 @@ "sessions": { "key": "MY_SESSION_KEY", "cycleKey": true + }, + "sql": { + "connection_str": "store.db", + "always_reset": true, + "commands": { + "Init": "sql/init_db.sql", + "Seed": "sql/seed_db.sql", + "GetProduct": "sql/get_product.sql", + "GetProducts": "sql/get_products.sql", + "GetCategories": "sql/get_categories.sql", + "GetPage": "sql/get_product_page.sql", + "GetPageCount": "sql/get_page_count.sql", + "GetCategoryPage": "sql/get_category_product_page.sql", + "GetCategoryPageCount": "sql/get_category_product_page_count.sql" + } } } \ No newline at end of file diff --git a/32-platform/sportsstore/go.mod b/32-platform/sportsstore/go.mod index bbb8554..ffe09bb 100644 --- a/32-platform/sportsstore/go.mod +++ b/32-platform/sportsstore/go.mod @@ -1,12 +1,25 @@ module sportstore -go 1.24 +go 1.24.0 + +toolchain go1.24.9 require platform v1.0.0 require ( + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/gorilla/securecookie v1.1.2 // indirect github.com/gorilla/sessions v1.4.0 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/ncruces/go-strftime v0.1.9 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect + golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b // indirect + golang.org/x/sys v0.36.0 // indirect + modernc.org/libc v1.66.10 // indirect + modernc.org/mathutil v1.7.1 // indirect + modernc.org/memory v1.11.0 // indirect + modernc.org/sqlite v1.40.0 // indirect ) replace platform v1.0.0 => ../platform diff --git a/32-platform/sportsstore/go.sum b/32-platform/sportsstore/go.sum index d45327c..ccb656e 100644 --- a/32-platform/sportsstore/go.sum +++ b/32-platform/sportsstore/go.sum @@ -1,4 +1,27 @@ +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA= github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo= github.com/gorilla/sessions v1.4.0 h1:kpIYOp/oi6MG/p5PgxApU8srsSw9tuFbt46Lt7auzqQ= github.com/gorilla/sessions v1.4.0/go.mod h1:FLWm50oby91+hl7p/wRxDth9bWSuk0qVL2emc7lT5ik= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= +github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o= +golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= +golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +modernc.org/libc v1.66.10 h1:yZkb3YeLx4oynyR+iUsXsybsX4Ubx7MQlSYEw4yj59A= +modernc.org/libc v1.66.10/go.mod h1:8vGSEwvoUoltr4dlywvHqjtAqHBaw0j1jI7iFBTAr2I= +modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU= +modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg= +modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI= +modernc.org/memory v1.11.0/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw= +modernc.org/sqlite v1.40.0 h1:bNWEDlYhNPAUdUdBzjAvn8icAs/2gaKlj4vM+tQ6KdQ= +modernc.org/sqlite v1.40.0/go.mod h1:9fjQZ0mB1LLP0GYrp39oOJXx/I2sxEnZtzCmEQIKvGE= diff --git a/32-platform/sportsstore/mian.go b/32-platform/sportsstore/mian.go index ce550e9..3f6e20b 100644 --- a/32-platform/sportsstore/mian.go +++ b/32-platform/sportsstore/mian.go @@ -15,7 +15,8 @@ import ( func registerServices() { services.RegisterDefaultService() - repo.RegisterMemoryRepoService() + // repo.RegisterMemoryRepoService() + repo.RegisterSqlRepositoryService() sessions.RegisterSessionService() cart.RegisterCartService() } diff --git a/32-platform/sportsstore/models/repo/sql_service.go b/32-platform/sportsstore/models/repo/sql_service.go new file mode 100644 index 0000000..1e65829 --- /dev/null +++ b/32-platform/sportsstore/models/repo/sql_service.go @@ -0,0 +1,42 @@ +package repo + +import ( + "context" + "database/sql" + "platform/config" + "platform/logging" + "platform/services" + "sportstore/models" + "sync" +) + +func RegisterSqlRepositoryService() { + var db *sql.DB + var commands *SqlCommands + var needInit bool + loadOnce := sync.Once{} + resetOnce := sync.Once{} + err := services.AddScoped(func(ctx context.Context, config config.Configuration, logger logging.Logger) models.Repository { + loadOnce.Do(func() { + db, commands, needInit = openDb(config, logger) + }) + repo := &SqlRepository{ + Configuration: config, + Logger: logger, + Commands: *commands, + DB: db, + Context: services.NewServiceContext(ctx), + } + resetOnce.Do(func() { + if needInit || config.GetBoolDefault("sql:always_reset", true) { + repo.Init() + repo.Seed() + } + }) + return repo + }) + if err != nil { + panic(err) + return + } +}