模型操作
最后更新于:2022-04-02 02:48:28
[TOC]
> 数据表中字段是不区分大小写的
## model 操作
```
type HsDept struct {
DEPT_ROOT_ID string `orm:"pk"`
}
orm.RegisterDriver("mysql", orm.DRMySQL)
orm.RegisterDataBase("default", "mysql", "root:www.upsoft01.com@tcp(192.168.0.71:3306)/antdbms_test2?charset=utf8", 60)
//需要添加这一步才能查找对应的数据表,不然会报错,找不到改表
orm.RegisterModel(new(HsDept))
```
## 在程序中直接调用自动建表
```
// 数据库别名
name := "default"
// drop table 后再建表
force := true
// 打印执行过程
verbose := true
// 遇到错误立即返回
err := orm.RunSyncdb(name, force, verbose)
if err != nil {
fmt.Println(err)
}
```
## row 的返回值 [推荐]
`QueryRow` 或者`QueryRows`
```
type User struct {
Id int
UserName string
}
var user User
err := o.Raw("SELECT id, user_name FROM user WHERE id = ?", 1).QueryRow(&user)
```
## row 的返回值 [不推荐]
1. Values 返回带自带名的 数组
```
var param []orm.Params
_, e := o.Raw("sql 语句").Values(¶m)
beego.Debug(param) // [map[order_id:1 dept_id:1 dept_parent_id: name:指挥导控系统]]
```
2. ValuesList 返回不带字段名的数组
```
var param []orm.ParamsList
_, e := o.Raw("sql 语句").ValuesList(¶m)
beego.Debug(param) //[[1 指挥导控系统 1]]
```
3. ValuesFlat
```
var param orm.ParamsList
_, e := o.Raw("sql 语句").ValuesFlat(¶m)
beego.Debug(param) // [1 指挥导控系统 1]
```
## 数据库操作
## CRUD 查询
### 查
单条查询
```
//查默认通过主键
user := HsUser{UserId: 146}
err := o.Read(&user)
fmt.Println(user)
//指定查询条件
user := HsUser{UserName: "aaa", UserLogin: "aaa1"}
err := o.Read(&user, "user_name", "user_login") //第二参数开始为条件
fmt.Println(user)
//高级查询
var post Post
//QueryTable(new(post)) 也支持此类写法
o.QueryTable("post").Filter("Content__istartswith", "prefix string").One(&post, "Id", "Title")
```
多条查询
```
// 只返回 Id 和 Title
var posts []Post
//QueryTable(new(post)) 也支持此类写法
o.QueryTable("post").Filter("Status", 1).All(&posts, "Id", "Title")
```
### 增
1. 单个更新
```
user.Name = "slene"
user.IsActive = true
id, err := o.Insert(&user)
```
2. 多个更新
```
users := []User{
{Name: "slene"},
{Name: "astaxie"},
{Name: "unknown"},
...
}
//第一个参数 bulk 为并列插入的数量,第二个为对象的slice
//bulk 为 1 时,将会顺序插入 slice 中的数据
successNums, err := o.InsertMulti(100, users)
```
### 更新
```
//1. 更新所有字段
user.UserName="update_pvj1"
i, err := o.Update(&user)
//2.更新指定字段
user.UserName="update_pvj1"
Update(&user,"user_name",...)
```
## 删除
```go
o.Delete(&User{Id: 1})
```
## 高级查询
```go
// 获取 QuerySeter 对象,user 为表名
qs := o.QueryTable("user")
// 也可以直接使用对象作为表名
user := new(User)
qs = o.QueryTable(user) // 返回 QuerySeter
```
## 关系性数据库需要注意
';