[TOC]
# 模型(Models)- beego ORM
[](https://drone.io/github.com/astaxie/beego/latest) [](http://gowalker.org/github.com/astaxie/beego/orm)
beego ORM 是一個強大的 Go 語言 ORM 框架。她的靈感主要來自 Django ORM 和 SQLAlchemy。
目前該框架仍處于開發階段,可能發生任何導致不兼容的改動。
**已支持數據庫:**
* MySQL:[github.com/go-sql-driver/mysql](https://github.com/go-sql-driver/mysql)
* PostgreSQL:[github.com/lib/pq](https://github.com/lib/pq)
* Sqlite3:[github.com/mattn/go-sqlite3](https://github.com/mattn/go-sqlite3)
以上數據庫驅動均通過基本測試,但我們仍需要您的反饋。
**ORM 特性:**
* 支持 Go 的所有類型存儲
* 輕松上手,采用簡單的 CRUD 風格
* 自動 Join 關聯表
* 跨數據庫兼容查詢
* 允許直接使用 SQL 查詢/映射
* 嚴格完整的測試保證 ORM 的穩定與健壯
更多特性請在文檔中自行品讀。
**安裝 ORM:**
go get github.com/astaxie/beego/orm
## 修改日志
* 2016-01-18: [規范了數據庫驅動的命名](orm.md#registerdriver)
* 2014-03-10: [GetDB](orm.md#getdb) 從注冊的數據庫中返回 *sql.DB. [ResetModelCache](orm.md#resetmodelcache) 重置已注冊的模型struct
* 2014-02-10: 隨著beego1.1.0的發布提交的改進
- 關于 [時區設置](orm.md#時區設置)
- 新增的 api:
Ormer.[InsertMulti](object.md#insertmulti)
Ormer.[ReadOrCreate](object.md#readorcreate)
RawSeter.[RowsToMap](rawsql.md#rowstomap)
RawSeter.[RowsToStruct](rawsql.md#rowstostruct)
orm.[NewOrmWithDB](orm.md#newormwithdb)
- 改進的 api:
RawSeter.[Values](rawsql.md#values) 支持設置 columns
RawSeter.[ValuesList](rawsql.md#valueslist) 支持設置 columns
RawSeter.[ValuesFlat](rawsql.md#valuesflat) 支持設置 column
RawSeter.[QueryRow/QueryRows](rawsql.md#queryrow) 從對應每個strcut field位置的賦值,改為對應名稱取值(不需要對應好字段數量與位置)
* 2013-10-14: [自動載入關系字段](query.md#載入關系字段),[多對多關系操作](query.md#多對多關系操作),完善[關系查詢](query.md#關系查詢)
* 2013-10-09: [原子操作更新值](query.md#update)
* 2013-09-22: [RegisterDataBase](orm.md#registerdatabase) maxIdle / maxConn 設置為可選參數, MySQL [自定義引擎](models.md#自定義引擎)
* 2013-09-16: 支持設置 空閑鏈接數 和 最大鏈接數 [SetMaxIdleConns](orm.md#setmaxidleconns) / [SetMaxOpenConns](orm.md#SetMaxOpenConns)
* 2013-09-12: [Read](object.md#read) 支持設定條件字段 [Update](object.md#update) / [All](query.md#all) / [One](query.md#one) 支持設定返回字段
* 2013-09-09: Raw SQL [QueryRow/QueryRows](rawsql.md#queryrow) 功能完成
* 2013-08-27: [自動建表](cmd.md#自動建表)繼續改進
* 2013-08-19: [自動建表](cmd.md#自動建表)功能完成
* 2013-08-13: 更新數據庫類型測試
* 2013-08-13: 增加 Go 類型支持,包括 int8、uint8、byte、rune 等
* 2013-08-13: 增強 date/datetime 的時區支持
## 快速入門
### 簡單示例
```go
package main
import (
"fmt"
"github.com/astaxie/beego/orm"
_ "github.com/go-sql-driver/mysql" // import your used driver
)
// Model Struct
type User struct {
Id int
Name string `orm:"size(100)"`
}
func init() {
// set default database
orm.RegisterDataBase("default", "mysql", "root:root@/my_db?charset=utf8", 30)
// register model
orm.RegisterModel(new(User))
// create table
orm.RunSyncdb("default", false, true)
}
func main() {
o := orm.NewOrm()
user := User{Name: "slene"}
// insert
id, err := o.Insert(&user)
fmt.Printf("ID: %d, ERR: %v\n", id, err)
// update
user.Name = "astaxie"
num, err := o.Update(&user)
fmt.Printf("NUM: %d, ERR: %v\n", num, err)
// read one
u := User{Id: user.Id}
err = o.Read(&u)
fmt.Printf("ERR: %v\n", err)
// delete
num, err = o.Delete(&u)
fmt.Printf("NUM: %d, ERR: %v\n", num, err)
}
```
### 關聯查詢
```go
type Post struct {
Id int `orm:"auto"`
Title string `orm:"size(100)"`
User *User `orm:"rel(fk)"`
}
var posts []*Post
qs := o.QueryTable("post")
num, err := qs.Filter("User__Name", "slene").All(&posts)
```
### SQL 查詢
當您無法使用 ORM 來達到您的需求時,也可以直接使用 SQL 來完成查詢/映射操作。
```go
var maps []orm.Params
num, err := o.Raw("SELECT id FROM user WHERE name = ?", "slene").Values(&maps)
if num > 0 {
fmt.Println(maps[0]["id"])
}
```
### 事務處理
```go
o.Begin()
...
user := User{Name: "slene"}
id, err := o.Insert(&user)
if err == nil {
o.Commit()
} else {
o.Rollback()
}
```
### 調試查詢日志
在開發環境下,您可以使用以下指令來開啟查詢調試模式:
```go
func main() {
orm.Debug = true
...
```
開啟后將會輸出所有查詢語句,包括執行、準備、事務等。
例如:
```go
[ORM] - 2013-08-09 13:18:16 - [Queries/default] - [ db.Exec / 0.4ms] - [INSERT INTO `user` (`name`) VALUES (?)] - `slene`
...
```
注意:我們不建議您在部署產品后這樣做。
- 寫在前面的話
- 第0章 beego 簡介
- 0.1 為beego貢獻
- 0.2 發布版本
- 0.3 升級指南
- 第1章 安裝升級
- 1.1 bee工具的使用
- 第2章 快速入門
- 2.1 新建項目
- 2.2 路由設置
- 2.3 Controller運行機制
- 2.4 Model邏輯
- 2.5 View編寫
- 2.6 靜態文件處理
- 第3章 beego的MVC架構
- 3.1 Model設計
- 3.1.1 概述
- 3.1.2 ORM使用
- 3.1.3 CRUD操作
- 3.1.4 高級查詢
- 3.1.5 原生SQL查詢
- 3.1.6 構造查詢
- 3.1.7 事物處理
- 3.1.8 模型定義
- 3.1.9 命令模式
- 3.1.10 測試用例
- 3.1.11 自定義字段
- 3.1.12 FAQ
- 3.2 View設計
- 3.2.1 模板語法指南
- 3.2.2 模板處理
- 3.2.3 模板函數
- 3.2.4 靜態文件處理
- 3.2.5 模板分頁處理
- 3.3 Controller設計
- 3.3.1 參數配置
- 3.3.2 路由設置
- 3.3.3 控制器函數
- 3.3.4 XSRF過濾
- 3.3.5 請求數據處理
- 3.3.6 session 控制
- 3.3.7 過濾器
- 3.3.8 flash 數據
- 3.3.9 URL構建
- 3.3.10 多種格式數據輸出
- 3.3.11 表單數據驗證
- 3.3.12 錯誤處理
- 3.3.13 日志處理
- 第4章 beego的模塊設計
- 4.1 session 模塊
- 4.2 grace 模塊
- 4.3 cache 模塊
- 4.4 logs 模塊
- 4.5 httplib 模塊
- 4.6 context 模塊
- 4.7 toolbox 模塊
- 4.8 config 模塊
- 4.9 i18n 模塊
- 第5章 beego高級編程
- 5.1 進程內監控
- 5.2 API自動化文檔
- 第6章 應用部署
- 6.1 獨立部署
- 6.2 Supervisor部署
- 6.3 Nginx 部署
- 6.4 Apache 部署
- 第7章 第三方庫
- 第8章 應用例子
- 8.1 在線聊天室
- 8.2 短域名服務
- 8.3 Todo列表
- 第9章 FAQ