• 数据库操作
    • 操作示例
      • 1. ORM对象
      • 2. 数据写入
      • 3. 数据查询(列表)
      • 4. 数据查询(单条)
      • 5. 数据保存
      • 6. 批量操作
      • 7. 数据更新/删除

    数据库操作

    gdb方法操作相对链式操作更偏底层操作一些,在项目开发中常用链式操作,因为链式操作更简单灵活,但链式操作执行不了太过于复杂的SQL操作,可以交给方法操作来处理。

    接口文档:https://godoc.org/github.com/gogf/gf/g/database/gdb

    1. // SQL操作方法,返回原生的标准库sql对象
    2. Query(query string, args ...interface{}) (*sql.Rows, error)
    3. Exec(query string, args ...interface{}) (sql.Result, error)
    4. Prepare(query string) (*sql.Stmt, error)
    5. // 数据表记录查询:
    6. // 查询单条记录、查询多条记录、获取记录对象、查询单个字段值(链式操作同理)
    7. GetAll(query string, args ...interface{}) (Result, error)
    8. GetOne(query string, args ...interface{}) (Record, error)
    9. GetValue(query string, args ...interface{}) (Value, error)
    10. GetCount(query string, args ...interface{}) (int, error)
    11. GetStruct(objPointer interface{}, query string, args ...interface{}) error
    12. GetStructs(objPointerSlice interface{}, query string, args ...interface{}) error
    13. GetScan(objPointer interface{}, query string, args ...interface{}) error
    14. // 数据单条操作
    15. Insert(table string, data interface{}, batch...int) (sql.Result, error)
    16. Replace(table string, data interface{}, batch...int) (sql.Result, error)
    17. Save(table string, data interface{}, batch...int) (sql.Result, error)
    18. // 数据批量操作
    19. BatchInsert(table string, list interface{}, batch...int) (sql.Result, error)
    20. BatchReplace(table string, list interface{}, batch...int) (sql.Result, error)
    21. BatchSave(table string, list interface{}, batch...int) (sql.Result, error)
    22. // 数据修改/删除
    23. Update(table string, data interface{}, condition interface{}, args ...interface{}) (sql.Result, error)
    24. Delete(table string, condition interface{}, args ...interface{}) (sql.Result, error)
    25. // 创建链式操作对象(Table为From的别名)
    26. Table(tables string) (*Model)
    27. From(tables string) (*Model)
    28. // 开启事务操作
    29. Begin() (*TX, error)
    30. // 设置管理
    31. SetDebug(debug bool)
    32. GetQueriedSqls() []*Sql
    33. PrintQueriedSqls()
    34. SetMaxIdleConns(n int)
    35. SetMaxOpenConns(n int)
    36. SetConnMaxLifetime(n int)

    需要注意的是:

    1. Query返回的是原生的标准库的结果集对象,需要自行解析;
    2. 在执行数据查询时推荐使用Get*系列查询方法;
    3. Insert/Replace/Save方法中的data参数支持的数据类型为:string/map/slice/struct/*struct,当传递为slice类型时,自动识别为批量操作,此时batch参数有效;
    4. Batch*方法中的list参数类型支持任意的slice类型;

    操作示例

    1. ORM对象

    1. // 获取默认配置的数据库对象(配置名称为"default")
    2. db := g.Database()
    3. // 或者(别名方式, 推荐)
    4. db := g.DB()
    5. // 获取配置分组名称为"user-center"的数据库对象
    6. db := g.Database("user-center")
    7. // 或者 (别名方式, 推荐)
    8. db := g.DB("user-center")
    9. // 使用原生New方法创建数据库对象
    10. db, err := gdb.New()
    11. db, err := gdb.New("user-center")
    12. // 使用原生单例管理方法获取数据库对象单例
    13. db, err := gdb.Instance()
    14. db, err := gdb.Instance("user-center")
    15. // 注意不用的时候不需要使用Close方法关闭数据库连接(并且gdb也没有提供Close方法),
    16. // 数据库引擎底层采用了链接池设计,当链接不再使用时会自动关闭

    2. 数据写入

    1. r, err := db.Insert("user", gdb.Map {
    2. "name": "john",
    3. })

    3. 数据查询(列表)

    1. list, err := db.GetAll("select * from user limit 2")
    2. list, err := db.GetAll("select * from user where age > ? and name like ?", g.Slice{18, "%john%"})
    3. list, err := db.GetAll("select * from user where status=?", g.Slice{1})

    4. 数据查询(单条)

    1. one, err := db.GetOne("select * from user limit 2")
    2. one, err := db.GetOne("select * from user where uid=1000")
    3. one, err := db.GetOne("select * from user where uid=?", 1000)
    4. one, err := db.GetOne("select * from user where uid=?", g.Slice{1000})

    5. 数据保存

    1. r, err := db.Save("user", gdb.Map {
    2. "uid" : 1,
    3. "name" : "john",
    4. })

    6. 批量操作

    1. // BatchInsert/BatchReplace/BatchSave 同理
    2. _, err := db.BatchInsert("user", gdb.List {
    3. {"name": "john_1"},
    4. {"name": "john_2"},
    5. {"name": "john_3"},
    6. {"name": "john_4"},
    7. }, 10)

    7. 数据更新/删除

    1. // db.Update/db.Delete 同理
    2. r, err := db.Update("user", gdb.Map {"name": "john"}, "uid=?", 10000)
    3. r, err := db.Update("user", "name='john'", "uid=10000")
    4. r, err := db.Update("user", "name=?", "uid=?", "john", 10000)

    注意,参数域支持并建议使用预处理模式(使用?占位符)进行输入,避免SQL注入风险。