Gorm框架学习---CRUD接口之查询 环境搭建 检索单个对象 用主键检索 检索全部对象 条件 String 条件 Struct & Map 条件 指定结构体查询字段 内联条件 Not 条件 Or.../driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" ) const MYSQL_ADDR="user:pass@tcp(127.0.0.1:3306...此外,如果相关 model 没有定义主键,那么将按 model 的第一个字段进行排序。...只会查询非零字段,这意味着如果您的字段的值为 0、‘’、false 或其他零值,则不会用于构建查询条件,例如: db.Where(&User{Name: "jinzhu", Age: 0}).Find..., "Antonio").Scan(&result) ---- 小结 Gorm框架高级查询的使用,这里就不列举了,官方文档已经给出了详细的介绍: https://gorm.io/zh_CN/docs/advanced_query.html
Gorm框架学习---CRUD接口之创建 环境准备 创建 创建记录 用指定的字段创建记录 批量插入 创建钩子 根据 Map 创建 使用 SQL 表达式、Context Valuer 创建记录 高级选项..."` } func main() { DB = openDB() //我想保存相关数据类型的零值到数据库,但是由于默认值的存在,插入数据库的还是默认值 DB.Create(&User{ Name...,会先检查该字段是否实现了对应的Scan接口 //如果实现了,就利用该接口完成赋值 func (s *myString) Scan(src any) error { if src == nil {...Value接口 return "hhhhh", nil } func main() { DB = openDB() //在获取每个字段值时,会检查对应的字段有没有实现Value接口 //如果实现了...,就获取Value接口的返回值,作为最终结果 DB.Create(&User{ Name: "xpy", Age: 0, }) } Gorm操作对象属性前,会先去寻找Scan和Value
API处理分页看似简单,实际上暗藏危机.最常见的分页方式,大概是下面这样的 页数表示法:/user/?page=1&size=15&name=李 偏移量表示法:/user/?...在这里我们将使用 jinzhu/gorm和 gin-gonic/gin 开发一个简单的分页接口 分页查询URL: http://dev.mojotv.cn:3333/api/ssh-log?...tag 接受gin的url-query参数 Page 当前页码,使用 form tag 接受gin的url-query参数 Data 分页的数据内容 Total 全部的页码数量 2....数据表Model 这里以ssh_log(ssh 命令日志为示例),使用GORM创建MYSQL数据表模型, 使用 form tag 接受gin的url-query参数,作为搜索条件 type SshLog...在这里我们将使用 jinzhu/gorm和 gin-gonic/gin 开发一个简单的分页接口 分页查询URL: http://dev.mojotv.cn:3333/api/ssh-log?
使用go的gin和gorm框架实现切换身份的接口,接收前端发送的JSON对象,查询数据库并更新,返回前端信息 接收前端发来的JSON对象,包含由openid和登陆状态组成的一个string和要切换的身份码...int型 后端接收后判断要切换的身份是否低于该用户身份,是则更新数据库的登录状态为要切换的身份码,返回由openid和新的登录状态组成的string,否则返回错误码和权限不足的错误信息 测试代码 创建两个结构体.../gin" "gorm.io/driver/mysql" "gorm.io/gorm" "log" "net/http" "strconv" ) type User struct { Openid...charset=utf8mb4&parseTime=True&loc=Local" db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if...= nil { log.Fatal(err) } router := gin.Default() // 接口测试地址 192.168.160.128:8080/update router.POST
struct,由 Go 的基本数据类型、实现了 Scanner 和 Valuer 接口的自定义类型及其指针或别名组成 例如: type User struct { ID uint...并且可以和其他标签一起使用,例如:not null、size, autoIncrement… 像 varbinary(8) 这样指定数据库数据类型也是支持的。...在使用指定数据库数据类型时,它需要是完整的数据库数据类型,如:MEDIUMINT UNSIGNED not NULL AUTO_INCREMENT serializer specifies serializer..., // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引 DontSupportRenameColumn: true, // 用 `change...sqlDB.SetConnMaxLifetime(time.Hour) 查看 通用接口 获取详情。 ---- 参考 Gorm官网
01 概念 在项目开发中,我们可能会随时调整声明的模型,比如添加字段和索引,使用 GORM 的自动迁移功能,可以始终让我们的数据库表保持最新。...此外,GORM 还提供了一些迁移接口的方法,可以帮助我们方便操作数据库表、字段和索引。 02 自动迁移 AutoMigrate 用于自动迁移您的 schema,保持您的 schema 是最新的。...: true, }) 03 迁移接口的方法 操作数据库 返回当前操作的数据库名 currentDBName := gormDB.Migrator().CurrentDatabase() fmt.Printf...GORM 约定使用结构体名的复数形式作为表名,不过也可以根据需求修改,可以实现Tabler 接口来更改默认表名,不过这种方式不支持动态变化,它会被缓存下来以便后续使用,如果想要使用动态表名,可以使用Scopes...GORM 约定使用结构体的字段名作为数据表的字段名,可以通过标签 column 修改。
序 本文主要研究一下gorm的DeletedAt advance-gorm-3-638.jpg DeletedAt gorm.io/gorm@v1.20.10/soft_delete.go type...return []clause.Interface{SoftDeleteDeleteClause{Field: f}} } DeletedAt为sql.NullTime类型,它实现了Scanner接口的...Scan方法,实现了Valuer接口的Value方法;同时定义了MarshalJSON、UnmarshalJSON方法,还定义了QueryClauses方法,使用的是SoftDeleteQueryClause...;DeleteClauses方法使用的是SoftDeleteDeleteClause SoftDeleteQueryClause gorm.io/gorm@v1.20.10/soft_delete.go...;schema的Parse方法会回调这些interface的对应方法 小结 gorm的DeletedAt为sql.NullTime类型,它定义了QueryClauses方法,使用的是SoftDeleteQueryClause
序 本文主要研究一下gorm的DeletedAt DeletedAt gorm.io/gorm@v1.20.10/soft_delete.go type DeletedAt sql.NullTime...return []clause.Interface{SoftDeleteDeleteClause{Field: f}} } DeletedAt为sql.NullTime类型,它实现了Scanner接口的...Scan方法,实现了Valuer接口的Value方法;同时定义了MarshalJSON、UnmarshalJSON方法,还定义了QueryClauses方法,使用的是SoftDeleteQueryClause...;DeleteClauses方法使用的是SoftDeleteDeleteClause SoftDeleteQueryClause gorm.io/gorm@v1.20.10/soft_delete.go...;schema的Parse方法会回调这些interface的对应方法 小结 gorm的DeletedAt为sql.NullTime类型,它定义了QueryClauses方法,使用的是SoftDeleteQueryClause
序 本文主要研究一下gorm的logger OIP - 2021-01-10T234039.816.jpeg logger gorm.io/gorm@v1.20.10/logger/logger.go...Trace(ctx context.Context, begin time.Time, fc func() (string, int64), err error) } logger.Interface接口定义了...float64(elapsed.Nanoseconds())/1e6, rows, sql) } } } } logger实现了logger.Interface接口定义的...的logger提供了Interface接口,可以自己实现并全局设置或者在session级别设置;gorm默认的logger实现了logger.Interface接口定义的LogMode、Info、Warn...doc gorm
简单来说,就是接受前端微信小程序发来的数据保存到数据库,这是我写的第二个接口,相比前一个要稍微简单一些,而且因为前端页面也是我写的,参数类型自然是无缝对接@_@ 前端页面大概长这个样子 先用apifox...模拟发送请求测试 apifox可以直接复制JSON对象过来goland自动生成结构体类型,天啊我爱死了 这个是测试代码,当然我们的数据库要记得打开 package main import ( "github.com.../gin-gonic/gin" "gorm.io/driver/mysql" "gorm.io/gorm" "log" "net/http" ) type Emergency struct {...charset=utf8mb4&parseTime=True&loc=Local" db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if
序 本文主要研究一下gorm的Unscoped OIP - 2021-01-15T231557.840.jpeg Unscoped gorm.io/gorm@v1.20.11/chainable_api.go...方法在db.Statement.Unscoped为false的时候才追加db.Statement.Schema.DeleteClauses DeleteClauses gorm.io/gorm@v1.20.11...= nil { panic(err) } } 小结 gorm的Unscoped方法设置tx.Statement.Unscoped为true;针对软删除会追加SoftDeleteDeleteClause...,即设置deleted_at为指定的时间戳;而callbacks的Delete方法在db.Statement.Unscoped为false的时候才追加db.Statement.Schema.DeleteClauses...,而Unscoped则执行的是物理删除。
序 本文主要研究一下gorm的IsolationLevel IsolationLevel /usr/local/go/src/database/sql/sql.go // IsolationLevel...的Transaction方法提供了*sql.TxOptions参数,可以用于设置Isolation,它最后传递给具体的driver BeginTx github.com/go-sql-driver/mysql...、LevelRepeatableRead、LevelSnapshot、LevelSerializable、LevelLinearizable;gorm的Transaction方法提供了*sql.TxOptions...参数,可以用于设置Isolation,它最后传递给具体的driver;BeginTx会判断若指定的隔离级别不是default则会执行mapIsolationLevel映射到mysql支持的隔离级别,然后执行...doc gorm
序 本文主要研究一下gorm的logger logger gorm.io/gorm@v1.20.10/logger/logger.go type logger struct { Writer...Trace(ctx context.Context, begin time.Time, fc func() (string, int64), err error) } logger.Interface接口定义了...float64(elapsed.Nanoseconds())/1e6, rows, sql) } } } } logger实现了logger.Interface接口定义的...的logger提供了Interface接口,可以自己实现并全局设置或者在session级别设置;gorm默认的logger实现了logger.Interface接口定义的LogMode、Info、Warn...doc gorm
序 本文主要研究一下gorm的Transaction Transaction gorm.io/gorm@v1.20.10/finisher_api.go // Transaction start a transaction...方法针对非TxCommitter类型的db.Statement.ConnPool执行db.Begin,之后注册defer针对panicked或者err的执行tx.Rollback(),执行fc之后,判断...= nil { t.Error(err) } } 小结 gorm的DB提供了Transaction方法,相当于一个事务模板,自动commit或者rollback,它提供了func...(tx *gorm.DB) error参数用于自定义事务内的数据库操作。...doc gorm
序 本文主要研究一下gorm的OnConflict u=1258358460,1662352287&fm=26&gp=0.jpg OnConflict gorm.io/gorm@v1.20.11/clause...Column{Name: value}, Value: Column{Table: "excluded", Name: value}} } return assignments } 的DoUpdates...属性是Set类型,Set类型实际是Assignment数组;其Build方法会组装assignment的sql 实例 func onConflictDemo(db *gorm.DB) { entities...的OnConflict定义了Columns、Where、OnConstraint、DoNothing、DoUpdates、UpdateAll属性;Build方法会根据这些属性拼装sql,如果是DoNothing...doc gorm
序 本文主要研究一下gorm的Locking Locking gorm.io/gorm@v1.20.11/clause/locking.go type Locking struct { Strength...doc gorm
序 本文主要研究一下gorm的Locking OIP - 2021-01-18T234935.279.jpeg Locking gorm.io/gorm@v1.20.11/clause/locking.go...doc gorm
序 本文主要研究一下gorm的prometheus Plugin gorm.io/gorm@v1.20.10/interfaces.go // Plugin GORM plugin interface...type Plugin interface { Name() string Initialize(*DB) error } Plugin接口定义了Name、Initialize方法 Prometheus...err) } }) } startServer启动了http server提供了/metrics接口 startPush gorm.io/plugin/prometheus@...的Use方法用于启动一个plugin,它会执行plugin.Initialize(db) 实例 db.Use(prometheus.New(prometheus.Config{...的Plugin接口定义了Name、Initialize方法;gorm的Use方法用于启动一个plugin,它会执行plugin.Initialize(db);Prometheus实现了Plugin接口定义了
序 本文主要研究一下gorm的CreateInBatches CreateInBatches gorm.io/gorm@v1.20.11/finisher_api.go // CreateInBatches...其rowsAffected是每个批次的rowsAffected的累加 AddError gorm.io/gorm@v1.20.11/gorm.go // AddError add error to db...的CreateInBatches允许用户自定义batchSize,它会根据batchSize来分配进行create,但是他们是在同一个事务的,其rowsAffected是每个批次的rowsAffected...的累加。...doc gorm
接着上篇文章中的API分module的处理,我们今天来说说返回数据参数的处理吧。...在说之前我们先看看数据返回的格式 { "code": 200, "message": "ok", "data": "这个是泛型数据 map或者list" } 怎么处理呢?...下文我们结合YYModel进行转化使用 对于map的方式对应的是我们的Dictionary,YYModel给予我们友好的支持 + (instancetype)modelWithDictionary:...)cls json:(id)json 这样的支持 哈哈,你会说既然有这个还有啥还说的呢?...先等lz慢慢道来 前后端的数据返回对话 后:怎么给你们数据呢? App: 给个json,我们根据code来做判断,code==OK 我们解析data,code!
领取专属 10元无门槛券
手把手带您无忧上云