Gorm使用与数据库 |青训营笔记

129 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第4篇笔记

接下来我会对以下几方面进行总结:database理解,GORM使用简介

Database/sql理解

  1. 设计原理:database/sql为上层的应用程序提供了一个标准的api操作接口,为下层区段提供了一个驱动接口,在database/sql包里实现了连接池管理(池化技术)。

    连接池管理有两个方法:

连接池配置

func (db *DB) SetConnMaxIdleTime(d time.Duration)
func (db *DB) SetConnMaxLifetime(d time.Duration)
func (db *DB) SetMaxIdleConns(n int)
func (db *DB) SetMaxOpenConns(n int)

连接池状态

func (db *DB) Stats()DBStats
  1. Driver连接接口:
    import _ "github.com/go-sql-driver/mysql"
    func main(){
       db, err := sql.Open("mysql","gorm:gorm@tcp(localhost:9910)/gorm?charset=utf8&parseTime=True&loc=Local")
       }
    func init(){
       sql.Register("mysql",&MySQLDriver{})
       }
      

我们可以用应用结构体去改良上述的Driver连接,具体举例如下:

    import _ "github.com/go-sql-driver/mysql"
    func main(){
       connector, err := mysql.NewConnector(&mysql.Config{
         User:   "gorm",
         Passwd: "gorm",
         Net:    "tcp",
         Addr:   "127.0.0.1:3306",
         DBName: "gorm",
         ParseTime: true,
       })
       db := sql.OpenDB(connector)
   }

用上述明确的字段来创建连接。

Gorm简介

  1. SQL怎么生成

普通的SQL语句:找出年龄大于35岁并且角色不是管理者的打工人按照年龄排序等

  SELECT 'name', 'age', 'employee_number'   %Select clause
  FROM 'users'                              %From clause
  WHERE                                     %Where clause
     role <> "manager" AND
     age > 35
  ORDER BY age DESC                         %Order By clause
  LIMIT 10 OFFSET 10                        %Limit Clause
  FOR UPDATE                                %For Clause

使用gorm

db.Where("role <> ?","manager").Where("age > ?",35).Limit(100).Order("age desc").Find(&user)

前面全是 Chain method 最后是Finisher Method(决定这个gorm statement 最终方法)

这里我想说一下我在“抖音”制作项目中遇到的一个小问题:gorm Order用法可以是增或者减。这里我们需要注意如果是增许之需要在()中输入按照什么属性去增序即可;减序需要在后面加上desc,如上面例子所示。那么现在就衍生出一个问题,如果不是按照增或减的顺序怎么办呢?

我们想要按照特定的顺序[7,2,5,3]去输出结果,我们可以添加下面Chain method方法去实现:


.Clauses(clause.OrderBy{
   Expression: clause.Expr{SQL: "FIELD(id,?)", Vars: []interface{}{[7,2,5,3]}, WithoutParentheses: true}}).

  1. 插件怎么工作: Finisher -> 决定statment类型 -> 执行Callbacks -> 生成 SQL并执行

Callbacks有六种模式: Create, Query, Update, Delete, Row, Raw