<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          第二期Go開源說實錄:GORM 剖析與最佳實踐

          共 5280字,需瀏覽 11分鐘

           ·

          2021-01-21 23:33


          項目簡介


          GORM 是一款 設(shè)計簡潔、功能強大、自由擴展的全功能 ORM ,遵循了 API 精簡、測試優(yōu)先、最小驚訝、靈活擴展、無依賴 ?可信賴的設(shè)計原則。GORM做為一個全功能的ORM,提供了完善的功能,例如:
          • 關(guān)聯(lián):一對一、一對多、單表自關(guān)聯(lián)、多態(tài)關(guān)聯(lián);Preload、Joins 預(yù)加載;關(guān)聯(lián)模式

          • 事務(wù):嵌套事務(wù), Save Point

          • Hooks、Callbacks 自由擴展

          • 多數(shù)據(jù)庫、讀寫分離、Prometheus、Prepared Stmt、查詢優(yōu)化器、批量數(shù)據(jù)處理、代碼共享、子查詢、DryRun

          • SQL Builder、Smart Migration、復(fù)合主鍵、自定義類型 (JSON等)、SQL 表達式查詢創(chuàng)建更新、虛擬字段…

          • 真 ? 跨數(shù)據(jù)庫兼容等功能



          開源歷程


          ?GORM 第一次大概是 2013 年開源,當時在用 Go 寫一套支付系統(tǒng),當時 Go 的生態(tài)圈也不太成熟,總感覺別人家的輪子的不夠圓,所以準備自己造個更圓的輪子,于是就有了GORM。GORM 在開源過程中收益眾多,收集了很多反饋讓我們向著更好不斷迭代,還收集了特別多的邊緣情況,也讓我讀了各數(shù)據(jù)庫的相關(guān)文檔好多遍,極大的幫我們避免了不少的潛在問題,讓我們的系統(tǒng)穩(wěn)定性提高了很多,所以開源給我們的收益還是挺大的。
          ?GORM V2.0 的開發(fā)起因于 2020 年春節(jié)疫情假期剛好空出些時間,然后開始了 2.0 版本的開發(fā)計劃。2.0 版本是吸取了 1.0 版本的一些經(jīng)驗教訓,從零開始完全重寫的版本,在重寫的過程中性能、靈活性、擴展性都得到了很大的提升。

          分享提要


          本次分享主要從 GORM 的 CRUD 基本操作入手,然后延伸講解了一些高階的使用方法,例如使用 Map 更新創(chuàng)建查詢、批量插入/更新、SQL 表達式、默認值、零值問題、關(guān)聯(lián)操作、SQL Builder、命名參數(shù)等等。

          項目倉庫:https://github.com/go-gorm/gorm
          項目文檔:https://gorm.cn
          演講視頻:
          https://www.bilibili.com/video/BV1ST4y1T7NR
          演講PPT: ??
          https://www.slideshare.net/JinzhuZhang2/gorm-241179148

          補充介紹



          本次分享因為時間所限主要講解了普通用戶最常用的一些 CRUD 的功能介紹,還有挺多 GORM 的特性沒來得及和大家探索,不過 GORM 的文檔提供了比較全面的介紹,歡迎大家參考文檔了解詳情,這里給大家羅列了一個列表參考。

          做為普通用戶除了上面的介紹你還必須要知道的:
          • Method Chain 的線程安

            https://gorm.cn/zh_CN/docs/method_chaining.html

          • 防止 SQL 注入

            https://gorm.cn/zh_CN/docs/security.html

          • 錯誤處理

            https://gorm.cn/zh_CN/docs/error_handling.html

          做為普通用戶你最好知道的:
          • GORM 優(yōu)于配置的一些約定

            https://gorm.cn/zh_CN/docs/models.html#Conventions

          • 如何給字段來配置讀寫權(quán)限

            https://gorm.cn/zh_CN/docs/models.html#field_permission

          • 給多字段配置時間追蹤

            https://gorm.cn/zh_CN/docs/models.html#time_tracking

          • 自關(guān)聯(lián)定義 (一對一,多對多,一對多,單表自關(guān)聯(lián),多態(tài))、自定義 foreign key, reference、復(fù)合外鍵、自定義 JoinTable

          • Query 的一些 API: Pluck, FirstOrInit, FirstOrCreate (Assign, Attrs)

          • https://gorm.cn/zh_CN/docs/advanced_query.html#FirstOrInit

          • Migrations

            https://gorm.cn/zh_CN/docs/migration.html

          • 字段的 Tags 特殊配置支持

            https://gorm.cn/zh_CN/docs/models.html#tags

          • 如何使用 Context

            https://gorm.cn/zh_CN/docs/context.html

          • Transactions, Nested Transactions, Save Point, RollbackTo to Saved Point

            https://gorm.cn/zh_CN/docs/transactions.html

          • Gorm Config (跳過默認事務(wù)、修改命名策略、修改當前時間函數(shù)、只生成 SQL 不執(zhí)行模式、Prepared Stmt 加速模式等等)

            https://gorm.cn/zh_CN/docs/gorm_config.html

          • Session 模式概念及其配置 (如:跳過默認事務(wù)、修改命名策略、修改當前時間函數(shù)、只生成 SQL 不執(zhí)行模式、Prepared Stmt 加速模式等等)

            https://gorm.cn/zh_CN/docs/session.html

          • 定義索引、復(fù)合索引、優(yōu)先索引、約束等

            https://gorm.cn/zh_CN/docs/indexes.html https://gorm.cn/zh_CN/docs/constraints.html

          • 數(shù)據(jù)庫連接池配置

            https://gorm.cn/zh_CN/docs/generic_interface.html

          • 數(shù)據(jù)庫的不同連接參數(shù),以 mysql 為例子

            https://github.com/go-gorm/mysql#gorm-mysql-driver

          • Hooks 介紹

            https://gorm.cn/zh_CN/docs/hooks.html

          做為資深用戶你還需要知道:
          • 讀寫分離 / 多數(shù)據(jù)庫

            https://gorm.cn/zh_CN/docs/dbresolver.html

          • 使用查詢優(yōu)化器,指定索引查詢

            https://gorm.cn/zh_CN/docs/hints.html

          • Prometheus 集成

            https://gorm.cn/zh_CN/docs/prometheus.html

          • 使用復(fù)合主鍵

            https://gorm.cn/zh_CN/docs/composite_primary_key.html

          • 分庫分表 / 代碼共享

            https://gorm.cn/zh_CN/docs/scopes.html

          • Embedded Struct 定義共享 struct (參考 embedded tag)

          • 自定義數(shù)據(jù)類型(json 等數(shù)據(jù)類型支持)

            https://gorm.cn/zh_CN/docs/data_types.html

          • 如何提升性能

            https://gorm.cn/zh_CN/docs/performance.html

          如果你是一個定制開發(fā)者你需要知道的:
          • 多看源碼,貢獻社區(qū) ??

            https://github.com/go-gorm/gorm

          • 熟悉 Statement & Clause 概念

            https://www2.slideshare.net/JinzhuZhang2/gorm-gopher-china

          • 定制 Callbacks 插件

            https://gorm.cn/zh_CN/docs/write_plugins.html

          • 了解如何定制 driver 實現(xiàn)特殊需求 (各 driver 源碼,

            https://gorm.cn/zh_CN/docs/write_driver.html

          • 如何定制 logger ?

            https://gorm.cn/zh_CN/docs/logger.html

          • Set/Get/InstanceSet/InstanceGet Callback 傳遞參數(shù)

            https://gorm.cn/zh_CN/docs/settings.html

          問答環(huán)節(jié)


          1.如何設(shè)置表名前綴

          可以通過配置 gorm.Config 的 NamingStrategy 實現(xiàn)需求,具體參考:
          https://gorm.io/docs/gorm_config.html#NamingStrategy
          db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{NamingStrategy: schema.NamingStrategy{TablePrefix: "t_", // NOTE 這里SingularTable: true,SingularTable: true,},})


          默認的 NamingStrategy 可以實現(xiàn)一些常見的配置,如果不能滿足需求的話,可以選擇自定義 Namer 的 interface,例如:

          type Namer interface {TableName(table string) stringColumnName(table, column string) stringJoinTableName(table string) stringRelationshipFKName(Relationship) stringCheckerName(table, column string) stringIndexName(table, column string) string}

          2.db Session 是什么?他和 db connection 有什么關(guān)系?
          DB Session 只是一個變量,和 db Connection 無關(guān)。對于一個新的 DB Session 來說,還會共享原來的連接池。他的作用主要在于可用來給每個 Session 做一些常見的配置,常見配置例如跳過默認事務(wù)、修改命名策略、修改當前時間函數(shù)、只生成 SQL 不執(zhí)行模式、Prepared Stmt 加速模式等,詳情請參考
          https://gorm.io/docs/session.html
          還有一個要注意的問題是 Method Chain 的線程安全問題,可參考
          https://gorm.io/docs/method_chaining.html

          3.clause.Associations 進行級連刪除時發(fā)生錯誤會怎么樣?
          GORM 默認的所有的創(chuàng)建/更新/刪除都在一個事務(wù)內(nèi),如果在當中發(fā)生錯誤的話,會進行整體回滾。
          另外關(guān)于級連刪除,他只會刪除依賴他的關(guān)聯(lián) (has one, has many, many2many 中間表),而不會刪除他依賴的關(guān)聯(lián) (belongs to, many2many 源數(shù)據(jù)),舉個例子,如果有一個用戶,他在一個公司工作,他還擁有一個寵物,在對他進行級聯(lián)刪除的時候,只會刪除這個用戶,以及他所擁有的寵物,而不會刪除這個人的公司。

          4.如何在測試中 mock 數(shù)據(jù)
          可以使用 https://github.com/DATA-DOG/go-sqlmock 先建立一個 connection,例如
          import "github.com/DATA-DOG/go-sqlmock"mockdb, mock, err := sqlmock.New()
          然后在測試時可以通過使用現(xiàn)有連接的方式來配置 GORM,如果使用 mysql 數(shù)據(jù)庫,可以指定 mysql 的 driver,其它數(shù)據(jù)庫需要使用相應(yīng)的 driver:
          import ("gorm.io/gorm""gorm.io/driver/mysql")gormDB, err := gorm.Open(mysql.New(mysql.Config{Conn: mockdb,}), &gorm.Config{})
          不過個人還是推薦能使用真實數(shù)據(jù)庫測試就使用真實數(shù)據(jù)庫進行測試,畢竟行為還是有些不一樣,使用真實數(shù)據(jù)庫可以更好的、更早的發(fā)現(xiàn)線上問題。

          5.可以 Preload 預(yù)加載的時候使用其它的數(shù)據(jù)庫么?例如 postgres, mongodb

          默認不支持從其它的數(shù)據(jù)庫預(yù)加載,不過支持從同一種數(shù)據(jù)庫的其它服務(wù) IP 上加載,這部分可以參考 db resolver,多數(shù)據(jù)庫模式 https://gorm.io/docs/dbresolver.html
          如果想支持其它類的數(shù)據(jù)庫或從緩存服務(wù)器上查詢數(shù)據(jù)的話,需要通過自定義 callbacks,然后在 callbacks 里根據(jù)從 ?db.Statement 獲取當前的條件,然后根據(jù)這些條件從相應(yīng)的其它的數(shù)據(jù)庫、緩存數(shù)據(jù)庫中查詢出相應(yīng)數(shù)據(jù)并賦值回原對象中。
          瀏覽 190
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  学生妹一级性交毛片 | 美女啪啪免费视频 | 国产丝袜足交视频 | 男人天堂色色网 | 日韩 人妻 精品 |