Go數據庫操作:1、xorm包-基礎配置與映射

參考:xorm操作指南,這邊有一些配置或者其他的數據庫配置(主要是mysql)會省去,具體查看該文檔。


1、特性

  1. 支持Struct和數據庫表之間的靈活映射,並支持自動同步
  2. 事務支持,支持嵌套事務(支持類JAVA Spring的事務傳播機制)
  3. 同時支持原始SQL語句和ORM操作的混合執行
  4. 使用連寫來簡化調用
  5. 支持使用Id, In, Where, Limit, Join, Having, Table, Sql, Cols等函數和結構體等方式作爲條件
  6. 支持級聯加載Struct
  7. 支持類ibatis方式配置SQL語句(支持xml配置文件、json配置文件、xsql配置文件,支持pongo2、jet、html/template模板和自定義實現配置多種方式)
  8. 支持動態SQL功能
  9. 支持一次批量混合執行多個CRUD操作,並返回多個結果集
  10. 支持數據庫查詢結果直接返回Json字符串和xml字符串
  11. 支持SqlMap配置文件和SqlTemplate模板密文存儲和解析
  12. 支持緩存
  13. 支持主從數據庫(Master/Slave)數據庫讀寫分離
  14. 支持根據數據庫自動生成xorm的結構體
  15. 支持記錄版本(即樂觀鎖)
  16. 支持查詢結果集導出csv、tsv、xml、json、xlsx、yaml、html功能
  17. 支持SQL Builder github.com/go-xorm/builder

這些xorm的特性看下來,感覺和你在java中用mybatis或者hibernate還是比較類似的。主要開發比較關注的特性有下面這些(我覺得):

1 支持實體和表的屬性映射、2 事務傳播的支持,spring的事務傳播的實現可以參考我的csdn文章、5 和mybatis之前的分頁插件還有其他一些插件還是挺類似的 7 自己寫sql,這個功能我覺得很強 14 這個有點類似hibernate的逆向工程


2、安裝

      安裝很簡單,安裝命令:go get -u github.com/xormplus/xorm



3、Orm引擎(包含配置)

      他這邊有一個說明,感覺還是很有用的:

在xorm裏面,可以同時存在多個Orm引擎,一個Orm引擎稱爲Engine,一個Engine一般只對應一個數據庫。

感覺這個東西好處在於說我一個項目可能存在多個數據庫,而不是傳統的web架構,比如說現在在做的遊戲,可能跨服和單區服的數據庫不在同一個庫,那麼這個功能就派上用處了。就是不同的場景傳入不同的數據引擎以達到操作不同數據庫的目的。

1、創建(mysql爲例)

      這邊以連接mysql數據爲例:

	
	import (
	    _ "github.com/go-sql-driver/mysql"
	    "github.com/xormplus/xorm"
	)
	
	var engine *xorm.Engine
	
	func main() {
	    var err error
	    engine, err = xorm.NewEngine("mysql", "root:123@/test?charset=utf8")
	}

2、ping操作

創建完成engine之後,並沒有立即連接數據庫,此時可以通過engine.Ping()來進行數據庫的連接測試是否可以連接到數據庫。
-
另外對於某些數據庫有連接超時設置的,可以通過起一個定期Ping的Go程來保持連接鮮活。

具體的操作應該是看對應的場景是否有對應的需求。

3、操作日誌

      配置對應的日誌輸出級別和sql的展示,這個和hibernate有點類似。具體的配置如下:

1、配置輸出sql

      engine.ShowSQL(true),則會在控制檯打印出生成的SQL語句;

2、配置打印日誌級別

      engine.Logger().SetLevel(core.LOG_DEBUG),則會在控制檯打印調試及以上的信息;

3、配置輸出到文件

      如果需要配置輸出到文件的話,需要通過調用 NewSimpleLogger(w io.Writer)接收一個io.Writer接口,具體方式如下:

	f, err := os.Create("sql.log")
	if err != nil {
	    println(err.Error())
	    return
	}
	engine.SetLogger(xorm.NewSimpleLogger(f))

4、連接池操作

      這個和java的數據庫框架類似的設置操作:

如果需要設置連接池的空閒數大小,可以使用engine.SetMaxIdleConns()來實現。
-
如果需要設置最大打開連接數,則可以使用engine.SetMaxOpenConns()來實現。



4、表-結構體 映射

1、映射規則配置

1-名稱映射規則

      主要負責結構體名稱表名結構體field表字段的名稱 映射。由core.IMapper接口的實現者來管理,xorm內置了三種IMapper實現.

  1. core.SnakeMapper:支持struct爲駝峯式命名,表結構爲下劃線命名之間的轉換,這個是默認的Maper;
  2. core.SameMapper:支持結構體名稱和對應的表名稱以及結構體field名稱與對應的表字段名稱相同的命名;
  3. core.GonicMapper:和SnakeMapper很類似,但是對於特定詞支持更好,比如ID會翻譯成id而不是i_d。

2-設置方法

          engine.SetMapper(core.SameMapper{})

3-混合使用和自定義

  • 如果你使用了別的命名規則映射方案,也可以自己實現一個IMapper
  • 表名稱和字段名稱的映射規則默認是相同的,當然也可以設置爲不同,如:
    	//表名的映射和字段映射分開,這個還是比較靈活的。
    	engine.SetTableMapper(core.SameMapper{})
    	engine.SetColumnMapper(core.SnakeMapper{})
    

4-對應的類型映射

在這裏插入圖片描述

前綴映射,這個感覺沒什麼太多用處,可以參考:前綴映射

2、自定義映射和映射規則優先級

1-自定義表名和優先級

      這邊看了一下第一種自定義臨時表名的方法還是有點魔幻的,沒找到對應資料,看了源碼還是沒怎麼理解他的處理,正常第二種方式應該最常用, 後面再研究第一種方式吧

第一種方式:通過engine.Table()(engine是xorm引擎對象) 方法可以改變struct對應的數據庫表的名稱
第二種方式:實現TableName() string接口,就跟下面這樣,我隨便截了個項目中的圖
在這裏插入圖片描述
第三種方式:就是我們上面說的 Mapper 自動映射的表名

      上述三個方法按照順序優先級執行。mapper排在最後,留給很大的自定義空間。

2-字段映射

      字段映射有兩種方式,感覺這個自定義的空間還是有的

第一種方式:通過sturct中field對應的Tag中使用**xorm:"‘column_name’"**可以使該field對應的Column名稱爲指定名稱。(這裏使用兩個單引號將Column名稱括起來是爲了防止名稱衝突,因爲我們在Tag中還可以對這個Column進行更多的定義。如果名稱不衝突的情況,單引號也可以不使用。)

第二種方式:Mapper 自動映射的字段名

      同樣是按照前後優先級,Mapper映射的優先級最低

3-Column屬性定義

      Column屬性tag定義不只是定義名稱映射,還可以定義其他的屬性。我這邊只把可能會在項目中常用到的列舉出來,具體的還是看原文:Column屬性定義

Tag屬性名 作用說明
name 當前field對應的字段的名稱,可選,如不寫,則自動根據field名字和轉換規則命名,如與其它關鍵字衝突,請使用單引號括起來
pk 是否是Primary Key,如果在一個struct中有多個字段都使用了此標記,則這多個字段構成了複合主鍵,支持int32,int,int64,uint32,uint,uint64,string這7種Go的數據類型
[not ]null 或 notnull 是否可以爲空
autoincr 是否自增
unique或unique(uniquename) 是否是唯一,如不加括號則該字段不允許重複;如加上括號,則括號中爲聯合唯一索引的名字
- 這個Field將不進行字段映射
-> 這個Field將只寫入到數據庫而不從數據庫讀取
<- 這個Field將只從數據庫讀取,而不寫入到數據庫
created 這個Field將在Insert時自動賦值爲當前時間
updated 這個Field將在Insert或Update時自動賦值爲當前時間
default 0或default(0) 設置默認值,緊跟的內容如果是Varchar等需要加上單引號

4-Column映射其他規則

      1、如果field名稱爲Id而且類型爲int64並且沒有定義tag,則會被xorm視爲主鍵,並且擁有自增屬性。如果想用Id以外的名字或非int64類型做爲主鍵名,必須在對應的Tag上加上xorm:"pk"來定義主鍵(如果是Id字段,但是加上了xorm的tag並且沒有聲明爲pk,應該是不會被當成主鍵的。)
      2、string類型默認映射爲varchar(255),如果需要不同的定義,可以在tag中自定義,如:varchar(1024)
      3、支持type MyString string等自定義的field,支持Slice, Map等field成員,這些成員默認存儲爲Text類型,並且默認將使用Json格式來序列化和反序列化。
      4、支持數據庫字段類型爲Blob類型。如果是Blob類型,則先使用Json格式序列化再轉成[]byte格式。如果是[]byte或者[]uint8,則不做轉換二十直接以二進制方式存儲。
      5、實現了Conversion接口的類型或者結構體,將根據接口的轉換方式在類型和數據庫記錄之間進行相互轉換,這個接口的優先級是最高的。

就像下面這樣,順便說一下接口繼承的快捷鍵是Ctrl + i,拿去不謝
在這裏插入圖片描述

      xorm各個數據庫對應表結構類型,查看原文,這邊就不給出了:Column屬性定義

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章