# gorm **Repository Path**: larryzeal/gorm ## Basic Information - **Project Name**: gorm - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-06-26 - **Last Updated**: 2024-07-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # About Gorm https://gorm.io/zh_CN/docs/ ## Methods 所有的方法可以分为三类: 1. Chain Methods 2. Finisher Methods 3. New Session Methods > GORM organizes methods into three primary categories: `Chain Methods`, `Finisher Methods`, and `New Session Methods`. ### Chain Methods Chain methods 用于修改当前的Statement,或者追加Clauses到当前的Statement。 一些常见的链式方法包括: 1. Where (查询条件,可多个) 2. Select (指定字段,*代表全部) 3. Omit (忽略字段) 4. Joins (链表,不妨忽略,Raw更好) 5. Scopes (自定义查询方法) 6. Preload (忽略,关联查询用的) 7. Raw (原生SQL。注意: Raw 不能与其他链式方法一起使用) ### Finisher Methods Finisher methods 会立即执行所有已注册的回调(用于生成和执行SQL命令)。 1. Create (创建,忽略零值) 2. First (第一条,基于主键排序,取第一条),同理还有Last 3. Find (查询),注意零值的问题。 4. Take 5. Save (插入或更新,看有没有ID),注意,不能同时存在Model和Save,未定义行为! 6. Update (更新),更新时会忽略零值。默认必须指定条件,否则`ErrMissingWhereClause`,可以设置关闭,但不建议关闭。可以使用Select和Omit选择或者忽略更新的字段。 7. Delete (删除) - 逻辑删除:如果继承了gorm.Model或者gorm.,那默认的Delete只是逻辑删除 - 物理删除:如果需要物理删除,要么不继承,要么db.Unscoped().Delete 8. Scan (将结果绑定到指定的参数上 - 一般是指针) 9. Row (获取一行结果 - 就算SQL结果是多行,也只会取一行) 10. Rows (获取多行结果) ### New Session Methods GORM defines methods like `Session`, `WithContext`, and `Debug` as `New Session Methods`, which are essential for creating shareable and reusable `*gorm.DB` instances. 用于创建可复用的Session。 简单的说,Chain Methods 和 Finisher Methods 都不能安全复用,后续的修改会拼接先前的修改。 ## gorm数据类型 ## 自定义数据类型 简单的说,就是实现两个方法 Scanner/Valuer,就是告诉gorm怎么序列化和反序列化。 Demo如下 ```go type JSON json.RawMessage // 实现 sql.Scanner 接口,Scan 将 value 扫描至 Jsonb func (j *JSON) Scan(value interface{}) error { bytes, ok := value.([]byte) if !ok { return errors.New(fmt.Sprint("Failed to unmarshal JSONB value:", value)) } result := json.RawMessage{} err := json.Unmarshal(bytes, &result) *j = JSON(result) return err } // 实现 driver.Valuer 接口,Value 返回 json value func (j JSON) Value() (driver.Value, error) { if len(j) == 0 { return nil, nil } return json.RawMessage(j).MarshalJSON() } ``` ## 钩子方法 简单的说就是在增删改查前后调用的方法 ## 事务 增删改默认开启。 个人认为不如手动开启。 - db.Transaction() - db.Begin()/Rollback()/Commit()