<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      golang用pgx查詢數據時如何將查詢結果方便的放入Map中

      pgx庫簡介

      下面是來自官網的簡介: pgx - PostgreSQL驅動和工具包

      pgx是一個用于PostgreSQL的純Go語言驅動和工具包。

      pgx驅動是一個底層的高性能接口,暴露了PostgreSQL特有的功能,如LISTEN/NOTIFYCOPY。它還包含一個標準database/sql接口的適配器。

      工具包組件是一組相關的包,實現了像解析wire協議和PostgreSQL與Go之間的類型映射等PostgreSQL功能。這些底層包可用于實現替代驅動、代理、負載均衡器、邏輯復制客戶端等。

      pgx應該是目前最好的啟動包了,“pg” 另一個著名的PostgreSQL啟動包的狀態目前僅僅是維護了,并且推薦了pgx。

      "對于需要新功能或可靠解決報告中的錯誤的用戶,我們推薦使用正在積極開發中的pgx。" -pq維護人員

      pgx比較底層,沒有ORM的功能,比如我要將一行查詢結果掃描到一個Map中。

      近期由于開發一個pg到elastic的復制工具(包括wal增量復制和全量復制),在實現全量復制時,我需要將一行查詢結果放到Map中,結果尷尬了,pgx中竟然沒有這樣的功能,難道我要因此使用gorm或者xorm(雖然也很方便,但是多引入一個包我也不那么愿意),經過詢問必應,只得到了,自己聲明一堆和字段對應變量然后掃描這樣的例子:

       ?
       // RetreiveBook
       func RetreiveBook(db *sql.DB) ([]Book, error) {
          var books []Book
          // 查詢
          sql := `select book_id, title, author, to_char(publish_date, 'YYYY/MM/DD') as publish_date from m_book`
          rows, err := db.Query(sql)
          if err != nil {
             log.Println(err)
             return books, err
          }
          defer rows.Close()
       ?
          for rows.Next() {
             var book Book
             // 獲取各列的值,放到對應的地址中
             rows.Scan(&book.BookId, &book.Title, &book.Author, &book.PublishDate)
             books = append(books, book)
          }
       ?
          return books, nil
       }
       ?

      太麻煩了,我忍不了。

      pgx有內置的方法

      于是我不甘心的仔細查看pgx的文檔和實例,終于,我發現了這個方法:

       func pgx.CollectRows(rows pgx.Rows, fn pgx.RowToFunc[map[string]any]) ([]map[string]any, error)
       // func[T any](rows pgx.Rows, fn pgx.RowToFunc[T]) ([]T, error)
       // CollectRows iterates through rows, calling fn for each row, and collecting the results into a slice of T.

      但是顯然,這個方法是一次性的生成一個map的切片,如果數據量不大還好,但是對于我要用到的全量復制場景就未免不適合了,但是只要有了方向就好了,趕緊跟蹤進去,

       // CollectRows iterates through rows, calling fn for each row, and collecting the results into a slice of T.
       func CollectRows[T any](rows Rows, fn RowToFunc[T]) ([]T, error) {
        defer rows.Close()
       ?
        slice := []T{}
       ?
        for rows.Next() {
        value, err := fn(rows)
        if err != nil {
        return nil, err
        }
        slice = append(slice, value)
        }
       ?
        if err := rows.Err(); err != nil {
        return nil, err
        }
       ?
        return slice, nil
       }

      可見上述代碼中,僅僅是簡單的Next() Scan()然后回調pgx.RowToMap這個函數生成map,我不需要它一次性地給我map的切片,但是我可以輕松將他實現的過程移植到我的代碼中,至此問題完美解決了。至于pgx.RowToMap這個方法的實現,其實非常簡單,下面就是其源代碼:

       // RowToMap returns a map scanned from row.
       func RowToMap(row CollectableRow) (map[string]any, error) {
        var value map[string]any
        err := row.Scan((*mapRowScanner)(&value))
        return value, err
       }
       ?
       type mapRowScanner map[string]any
       ?
       func (rs *mapRowScanner) ScanRow(rows Rows) error {
        values, err := rows.Values()
        if err != nil {
        return err
        }
       ?
        *rs = make(mapRowScanner, len(values))
       ?
        for i := range values {
        (*rs)[string(rows.FieldDescriptions()[i].Name)] = values[i]
        }
       ?
        return nil
       }

      其中19行就是這個屬性方法rows.FieldDescriptions()我不知道,否則自己也可以方便地實現掃描到map的方法了。

      posted @ 2023-08-03 08:47  柒零壹  閱讀(466)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 在线播放亚洲成人av| 国内自拍偷拍福利视频看看| 国产午夜精品福利视频| 人妻伦理在线一二三区| 久久精品国产再热青青青| 国产午夜精品在人线播放| 国产精品久久久久久久久电影网| 久久96热在精品国产高清| 精品国产自线午夜福利| 久久国产精品不只是精品| 麻豆国产成人AV在线播放| 精品一卡2卡三卡4卡乱码精品视频| 日韩三级一区二区在线看| 精品久久久久久亚洲综合网| av天堂午夜精品一区| 国内精品久久久久影院薰衣草| 国产精品国产三级在线专区| 人妻体体内射精一区二区| 精品无码成人久久久久久| 少妇办公室好紧好爽再浪一点| 国产仑乱无码内谢| 国产一区二区三区十八禁| 无码中文字幕人妻在线一区| 国产极品尤物粉嫩在线观看| 欧美日韩精品一区二区三区高清视频 | 国产午夜福利高清在线观看| 亚洲成a人v欧美综合天堂下载| 成人精品区| 国产亚洲精品久久久久婷婷瑜伽| 久久婷婷成人综合色综合| h动态图男女啪啪27报gif| 中文字幕亚洲精品乱码| 精品无码久久久久久久久久| 亚洲五月天一区二区三区| 啦啦啦高清在线观看视频www| 粉嫩国产av一区二区三区 | 一本一道av无码中文字幕麻豆| 99久久精品国产熟女拳交| 中国少妇无码专区| 国产精品永久免费无遮挡| 国产精品美女乱子伦高|