## api路由 ``` type ParamReq struct { g.Meta `path:"/params" method:"post"` UserName string `p:"name" d:"林冲"` UserAge int `p:"age" d:"110"` } ``` p为param,能根据标签把username对应上,p为简写,d为设置默认值 ## 相应参数 ## 数据库 查询数据 ```go md := g.Model("book") bk, err := md.One() if err == nil { req.Response.WriteJson(bk) } ``` 调用one这个方法返回的类型本质上是一个map类型,用writeln时可以访问其中某一个字段,是泛型 ## 切片: | **特性** | **Java 数组** | **Go 数组** | **Go 切片 (Slice)** | | ---------------------- | ------------- | ------------------------- | -------------------------- | | **长度** | 固定 | 固定 | **动态可变** | | **类型定义** | `int[]` | `[3]int` (长度必写) | `[]int` (不写长度) | | **值传递 vs 引用传递** | 引用传递 | **值传递 (拷贝整个数组)** | **引用传递 (拷贝 Header)** | | **扩容** | 不支持 | 不支持 | 使用 `append()` 自动扩容 | go中主要用到的是切片,忘掉 Go 的数组,把 **Slice(切片)** 当作 **ArrayList** 来用,记得增加元素要用 `nums = append(nums, val)`。 ## model ```go func (c *Hello) DB(req *ghttp.Request) { md := g.Model("book") books, err := md.All() if err == nil { req.Response.WriteJson(books) } } ``` 这行代码的作用是: 创建数据库表模型 "book" 对应数据库中的表名 book md 是一个 *gdb.Model 对象,代表对 book 表的操作句柄 Model 的优势 ✅ 链式调用:可以流畅地组合多个操作 ✅ 类型安全:编译时检查错误 ✅ 自动映射:数据库记录自动映射到 Go 结构体 ✅ 防止 SQL 注入:参数化查询 model相当于一个sql语句的调用 ## Where/Where*/WhereOr/WhereOr* 查询数据时可以通过`Where`方法指定条件,如果有多个`Where`,则多个条件之间会用`AND`连接 **等于** 默认情况下条件会用=连接 ``` md := g.Model("book") books, err := md.Where("id", 1).All() ``` **不等** 如果是不等关系,需要在字段后面加上不等符号 ``` md := g.Model("book") books, err := md.Where("id>", 1).All() ``` **多个条件叠加** 有多个条件时可以多个`Where`进行链式调用,条件会用`AND`连接。 ``` md := g.Model("book") books, err := md.Where("id>=?", 2).Where("id value | | WhereGTE(column, value) | column >= value | | WhereBetween(column, min, max) | column BETWEEN min AND max | | WhereNotBetween(column, min, max) | column NOT BETWEEN min AND max | | WhereLike(column, like) | column LIKE like | | WhereIn(column, in) | column IN (in) | | WhereNotIn(column, in) | column NOT IN (in) | | WhereNot(column, value) | column != value | | WhereNull(columns1, columns2... ) | columns1 IS NULL AND columns2 IS NULL... | | WhereNotNull(columns1, columns2... ) | columns1 IS NOT NULL AND columns2 IS NOT NULL ... | | | | | | | 使用示例: ``` md := g.Model("book") books, err := md.WhereIn("id", g.Array{1, 2, 3}).WhereLike("name", "%数据%").All() // 生成如下SQL // SELECT * FROM `book` WHERE (`id` IN (1,2,3)) AND (`name` LIKE '%数据%') ``` 以上方法如果链式调用会生成以`AND`连接的条件,如果需要生成以`OR`连接的条件,则需要用到下列方法: **WhereOr系列方法** | 方法 | 生成的SQL条件表达式 | | -------------------------------------- | ------------------------------------------------------ | | WhereOrLT(column, value) | OR (column < value) | | WhereOrLTE(column, value) | OR (column <= value) | | WhereOrGT(column, value) | OR (column > value) | | WhereOrGTE(column, value) | OR (column >= value) | | WhereOrBetween(column, min, max) | OR (column BETWEEN min AND max) | | WhereOrNotBetween(column, min, max) | OR (column NOT BETWEEN min AND max) | | WhereOrLike(column, like) | OR (column LIKE like) | | WhereOrIn(column, in) | OR (column IN (in)) | | WhereOrNotIn(column, in) | OR (column NOT IN (in)) | | WhereOrNot(column, value) | OR (column != value) | | WhereOrNull(columns1, columns2... ) | OR (columns1 IS NULL AND columns2 IS NULL...) | | WhereOrNotNull(columns1, columns2... ) | OR (columns1 IS NOT NULL AND columns2 IS NOT NULL ...) | | WhereOr(column, value) | OR (column = value) | | | | 示例: ```go md := g.Model("book") books, err := md.WhereIn("id", g.Array{1, 2, 3}).WhereOrLike("name", "%数据%").All() // 生成如下SQL // SELECT * FROM `book` WHERE (`id` IN (1,2,3)) OR (`name` LIKE '%数据%') ``` 数据分页用page ## Scan `One`和`All`返回的数据为`Map`或者`Map`切片,在实际使用当中查询到的数据可能需要转换为特定的数据结构方便使用,scan返回值只需要一个err。 如果对应不上数据库表,可以用‘orm:”id“’来保证与后端查询的到 ```go type Book struct { BookId uint `orm:"id" ` BookName string `orm:"name"` BookAuthor string `orm:"author"` BookPrice float64 `orm:"price"` PubTime *gtime.Time `orm:"publish_time"` } ``` ## 插入数据 | 方法 | 主键在数据库中已存在时 | | ------- | ---------------------------------- | | Insert | 报错,主键冲突 | | Repalce | 用提供的数据替换已存在同主键的数据 | | Save | 用提供的数据更新已存在的同主键数据 | 返回一个result和err来接收; g.list是一个存map类型的切片 ## 数据更新: 注意:自减 操作 如果 自减后的值小于0 数据不会更新 Update 方法如何实现只更新非空字段 更新非空字段 在Update之前添加OmitEmpty ## 软删除 **软删除** > 软删除并不是真正从数据库中把记录删除,而是通过特定的标记在查询时过滤掉这些数据,使这些数据在页面上看不到,但实际上在数据库中仍然存在。通常用于一些需要历史追踪而不能真正删除的数据。 当数据表中有`deleted_at`字段时,使用`Delete`方法时不会物理删除数据,只是更新`deleted_at`字段的值。查询数据时,会自动加上WHERE `deleted_at` IS NULL这一条件,过滤掉已被“删除”的数据。 如果需要查询所有数据,需要使用`Unscoped`方法 ``` ls, _ := md.Unscoped().All() ``` 只用用model调用的时候才会总动生成,用sql不行。 ## 关联查询 - 使用`With`指定需要关联的内容 # homily link 天外飞仙,双龙出海 1. 天外飞仙技术要点 该方法的核心在于识别股价突破天线的变盘点。股价上涨前需出现"红盖头"现象,即买盘力量完全压制前期波动。 白色线上穿代表多空博弈出现转折,是重要买入信号。 股价必须突破天线并保持在天线外才可持续上涨。当股价被天线重新覆盖时,意味着风险将至。 2. 双龙出海技术要点 • 该方法通过黄色变局线判断股价启动时机。30分钟线出现全红买盘信号时,往往预示暴力拉升。 需要结合多空博弈指标判断买卖力量对比。股价变局的K线是重要转折标志。 若股价始终在天线内运行,则属于弱势形态。 3. 实际案例分析以特斯拉、英伟达等股票为例展示了技术方法的实际应用。腾讯案例特别强调了波动空间和买卖力量的重要性。 苹果案例演示了30分钟线的变局信号识别。 通过对比强弱形态说明交易时机的选择标准。强调智能化工具在研判股价强弱时的辅助作用。