使用 beedb 函式庫進行 ORM 開發
beego orm 是我開發的一個 Go 進行 ORM 操作的函式庫,它採用了 Go style 方式對資料庫進行操作,實現了 struct 到資料表記錄的對映。beego orm 是一個十分輕量級的 Go ORM 框架,開發這個函式庫的本意降低複雜的 ORM 學習曲線,儘可能在 ORM 的執行效率和功能之間尋求一個平衡,beego orm 是目前開源的 Go ORM 框架中實現比較完整的一個函式庫,而且執行效率相當不錯,功能也基本能滿足需求。
beego orm 是支援 database/sql 標準介面的 ORM 函式庫,所以理論上來說,只要資料庫驅動支援 database/sql 介面就可以無縫的接入 beego orm。目前我測試過的驅動包括下面幾個:
Mysql: github/go-mysql-driver/mysql
PostgreSQL: github.com/lib/pq
SQLite: github.com/mattn/go-sqlite3
Mysql: github.com/ziutek/mymysql/godrv
暫未支援資料庫:
MsSql: github.com/denisenkom/go-mssqldb
MS ADODB: github.com/mattn/go-adodb
Oracle: github.com/mattn/go-oci8
ODBC: bitbucket.org/miquella/mgodbc
安裝
beego orm 支援 go get 方式安裝,是完全按照 Go Style 的方式來實現的。
go get github.com/astaxie/beego如何初始化
首先你需要 import 相應的資料庫驅動套件、database/sql 標準介面套件以及 beego orm 套件,如下所示:
PostgreSQL 配置:
MySQL 配置:
Sqlite 配置:
匯入必須的 package 之後,我們需要開啟到資料庫的連結,然後建立一個 beego orm 物件(以 MySQL 為例),如下所示 beego orm:
簡單範例:
SetMaxIdleConns
根據資料庫的別名,設定資料庫的最大空閒連線
SetMaxOpenConns
根據資料庫的別名,設定資料庫的最大資料庫連線 (go >= 1.2)
目前 beego orm 支援列印除錯,你可以透過如下的程式碼實現除錯
接下來我們的例子採用前面的資料庫表 User,現在我們建立相應的 struct
注意一點,beego orm 針對駝峰命名會自動幫你轉化成下劃線欄位,例如你定義了 Struct 名字為
UserInfo,那麼轉化成底層實現的時候是user_info,欄位命名也遵循該規則。
插入資料
下面的程式碼示範了如何插入一條記錄,可以看到我們操作的是 struct 物件,而不是原生的 sql 語句,最後透過呼叫 Insert 介面將資料儲存到資料庫。
我們看到插入之後user.Uid就是插入成功之後的自增 ID。
同時插入多個物件:InsertMulti
類似 sql 語句
第一個參數 bulk 為並列插入的數量,第二個為物件的 slice
回傳值為成功插入的數量
bulk 為 1 時,將會順序插入 slice 中的資料
更新資料
繼續上面的例子來示範更新操作,現在 user 的主鍵已經有值了,此時呼叫 Insert 介面,beego orm 內部會自動呼叫 update 以進行資料的更新而非插入操作。
Update 預設更新所有的欄位,可以更新指定的欄位:
//Where:用來設定條件,支援多個參數,第一個參數如果為整數,相當於呼叫了 Where("主鍵=?",值)。
查詢資料
beego orm 的查詢介面比較靈活,具體使用請看下面的例子
例子 1,根據主鍵取得資料:
例子 2:
例子 3,WHERE IN 查詢條件:
例子 4,更加複雜的條件:
可以透過如下介面取得多條資料,請看範例
例子 1,根據條件 age>17,取得 20 位置開始的 10 條資料的資料
例子 2,limit 預設從 10 開始,取得 10 條資料
刪除資料
beedb 提供了豐富的刪除資料介面,請看下面的例子
例子 1,刪除一筆資料
Delete 操作會對反向關係進行操作,此例中 Post 擁有一個到 User 的外來鍵。刪除 User 的時候。如果 on_delete 設定為預設的級聯操作,將刪除對應的 Post
關聯查詢
有些應用卻需要用到連線查詢,所以現在 beego orm 提供了一個簡陋的實現方案:
上面程式碼中我們看到了一個 struct 關聯查詢
Group By 和 Having
針對有些應用需要用到 group by 的功能,beego orm 也提供了一個簡陋的實現
上面的程式碼中出現了兩個新介面函式
GroupBy:用來指定進行 groupby 的欄位
Having:用來指定 having 執行的時候的條件
使用原生 sql
簡單範例:
複雜原生 sql 使用:
更多說明,請到beego.me
進一步的發展
目前 beego orm 已經獲得了很多來自國內外使用者的反饋,我目前也正在考慮支援更多資料庫,接下來會在更多方面進行改進
links
上一節: 使用 PostgreSQL 資料庫
下一節: NoSQL 資料庫操作
Last updated