begoo——对象的CRUD操作
如果已知主键的值,那么可以使用这些方法进行CRUD操作
对object操作的四个方法Read/Insert/Update/Delete
1 2 3 4 5 6 7 8 9 10 | o := orm.NewOrm() user := new(User) //创建一个空对象 user.Name = "slene" //给属性赋值 fmt.Println(o.Insert(user)) //写入数据库 user.Name = "Your" fmt.Println(o.Update(user)) //更新操作 fmt.Println(o.Read(user)) //查看操作 fmt.Println(o.Delete(user)) //删除操作 |
Read
1 2 3 4 5 6 7 8 9 10 11 12 | o := orm.NewOrm() user := User{Id: 1} //创建一个结构体变量,其实就是一个对象 err := o.Read(&user) //在数据库中查看该对象,理论上查找不到 if err == orm.ErrNoRows { fmt.Println( "查询不到" ) } else if err == orm.ErrMissPK { fmt.Println( "找不到主键" ) } else { fmt.Println(user.Id, user.Name) } |
Read默认通过主键赋值,可以使用指定的字段进行查询:
1 2 3 | user := User{Name: "slene" } err = o.Read(&user, "Name" ) ... |
对象的其它字段值将会是对应类型的默认值。
ReadOrCreate
尝试从数据库读取,不存在的话就创建一个。
默认必须传入一个参数作为条件字段,同时也支持多个参数多个条件字段
1 2 3 4 5 6 7 8 9 10 | o := orm.NewOrm() user := User{Name: "slene" } // 三个返回参数依次为:是否新创建的,对象 Id 值,错误 if created, id, err := o.ReadOrCreate(&user, "Name" ); err == nil { if created { fmt.Println( "New Insert an object. Id:" , id) } else { fmt.Println( "Get an object. Id:" , id) } } |
Insert
第一个返回值为自增键id的值
1 2 3 4 5 6 7 8 9 | o := orm.NewOrm() var user User user.Name = "slene" user.IsActive = true id, err := o.Insert(&user) if err == nil { fmt.Println(id) } |
创建后会自动对auto的field赋值。
InsertMulti
同时插入多个对象
类似sql语句
1 | insert into table (name, age) values( "slene" , 28),( "astaxie" , 30),( "unknown" , 20) |
第一个参数bulk为并列插入的数量,第二个为对象的slice,返回值为成功插入的数量。
1 2 3 4 5 6 7 | users := []User{ {Name: "slene" }, {Name: "astaxie" }, {Name: "unknown" }, ... } successNums, err := o.InsertMulti(100, users) |
bulk为1时,将会顺序插入slice中的数据。
Update
第一个返回值为影响的行数(对那行做的更新)
1 2 3 4 5 6 7 8 | o := orm.NewOrm() user := User{Id: 1} if o.Read(&user) == nil { user.Name = "MyName" if num, err := o.Update(&user); err == nil { fmt.Println(num) } } |
Update默认更新所有的字段,可以更新指定的字段
1 2 3 4 5 | // 只更新 Name o.Update(&user, "Name" ) // 指定多个字段 // o.Update(&user, "Field1", "Field2", ...) ... |
Delete
第一个返回值为影响的行数
1 2 3 4 | o := orm.NewOrm() if num, err := o.Delete(&User{Id: 1}); err == nil { fmt.Println(num) } |
Delete操作会对反向关系进行操作,此例中Post拥有一个到User的外键。删除User的时候,如果on_delete设置为默认的级联操作,将删除对应的Post
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
2017-12-15 Redis重大版本
2017-12-15 MySQL——存储引擎
2017-12-15 Redis使用场景
2017-12-15 查看一张表的信息