gorm 阅读4 query

发布时间 2023-12-21 15:34:54作者: codestacklinuxer
# 如果是查询QueryContext 
		=> (mc *mysqlConn) QueryContext(ctx context.Context, query string, args []driver.NamedValue) (driver.Rows, error)
				-> mc.watchCancel(ctx) 设置超时监控 channel ::  mc.watcher <- ctx
				-> rows, err := mc.query(query, dargs)
				=>(mc *mysqlConn) query(query string, args []driver.Value) (*textRows, error) 
						-> err := mc.writeCommandPacketStr(comQuery, query) 连接写入sql,tcp 发送包
						-> rows := new(textRows) 开辟存储结构的内存空间,类型是textRows
						-> rows.rs.columns, err = mc.readColumns(resLen) 从 tcp 二进制流读结果到rows
						-> return rows
			  => rows->return driver.Rows			
=> gorm.Scan(rows, db, mode) 将查询结构 rows 放入	Scan函数返回
		=> Scan(rows Rows, db *DB, mode ScanMode) 
				-> switch dest := db.Statement.Dest.(type) 根据 stmt 的 dest 类型设置怎么读 rows
				-> rows.Next()-> db.RowsAffected++ -> rows.Scan(values...)
				=> 类比原始 sql 操作
					for rows.Next() {
            err := rows.Scan(&id, &name)
            if err != nil {
              log.Fatal(err)
            }
            log.Println(id, name)
          }

————————————————

原文链接:https://blog.csdn.net/u013010890/article/details/132613100