1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 5280字,需瀏覽 11分鐘

         ·

        2021-01-21 23:33


        項(xiàng)目簡介


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

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

        • Hooks、Callbacks 自由擴(kuò)展

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

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

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



        開源歷程


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

        分享提要


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

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

        補(bǔ)充介紹



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

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

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

        • 防止 SQL 注入

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

        • 錯(cuò)誤處理

          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

        • 給多字段配置時(shí)間追蹤

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

        • 自關(guān)聯(lián)定義 (一對(duì)一,多對(duì)多,一對(duì)多,單表自關(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 (跳過默認(rèn)事務(wù)、修改命名策略、修改當(dāng)前時(shí)間函數(shù)、只生成 SQL 不執(zhí)行模式、Prepared Stmt 加速模式等等)

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

        • Session 模式概念及其配置 (如:跳過默認(rèn)事務(wù)、修改命名策略、修改當(dāng)前時(shí)間函數(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

        如果你是一個(gè)定制開發(fā)者你需要知道的:
        • 多看源碼,貢獻(xiàn)社區(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 實(shí)現(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 實(shí)現(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,},})


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

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

        4.如何在測試中 mock 數(shù)據(jù)
        可以使用 https://github.com/DATA-DOG/go-sqlmock 先建立一個(gè) connection,例如
        import "github.com/DATA-DOG/go-sqlmock"mockdb, mock, err := sqlmock.New()
        然后在測試時(shí)可以通過使用現(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{})
        不過個(gè)人還是推薦能使用真實(shí)數(shù)據(jù)庫測試就使用真實(shí)數(shù)據(jù)庫進(jìn)行測試,畢竟行為還是有些不一樣,使用真實(shí)數(shù)據(jù)庫可以更好的、更早的發(fā)現(xiàn)線上問題。

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

        默認(rèn)不支持從其它的數(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 獲取當(dāng)前的條件,然后根據(jù)這些條件從相應(yīng)的其它的數(shù)據(jù)庫、緩存數(shù)據(jù)庫中查詢出相應(yīng)數(shù)據(jù)并賦值回原對(duì)象中。
        瀏覽 190
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            风情万种AV| 日本不卡一区二区三区四区| 国产白丝精品91爽爽久久| 黄色三级毛片| 插穴网| 国产二区视频| 黄色一级aa片| 色图在线观看| 人人色人人色| 久草福利在线观看|