# 模型(Models)- 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", "username:password@tcp(127.0.0.1:3306)/db_name?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 * FROM user").Values(&maps)
for _,term := range maps{
fmt.Println(term["id"],":",term["name"])
}
```
### 事務處理
```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`
...
```
注意:我們不建議您在部署產品后這樣做。
## 文檔索引
1. [Orm 使用方法](orm.md)
- [數據庫的設置](orm.md#數據庫的設置)
* [驅動類型設置](orm.md#registerdriver)
* [參數設置](orm.md#registerdatabase)
* [時區設置](orm.md#時區設置)
- [注冊模型](orm.md#注冊模型)
- [ORM 接口使用](orm.md#orm-接口使用)
- [調試模式打印查詢語句](orm.md#調試模式打印查詢語句)
2. [對象的CRUD操作](object.md)
3. [高級查詢](query.md)
- [使用的表達式語法](query.md#expr)
- [支持的操作符號](query.md#operators)
- [高級查詢接口使用](query.md#高級查詢接口使用)
- [關系查詢](query.md#關系查詢)
- [載入關系字段](query.md#載入關系字段)
- [多對多關系操作](query.md#多對多關系操作)
4. [使用SQL語句進行查詢](rawsql.md)
5. [事務處理](transaction.md)
6. [模型定義](models.md)
- [自定義表名](models.md#自定義表名)
- [自定義引擎](models.md#自定義引擎)
- [設置參數](models.md#設置參數)
- [表關系設置](models.md#表關系設置)
- [模型字段與數據庫類型的對應](models.md#模型字段與數據庫類型的對應)
7. [命令模式](cmd.md)
- [自動建表](cmd.md#自動建表)
- [打印建表SQL](cmd.md#打印建表sql)
8. [Test ORM](test.md)
9. [自定義字段](custom_fields.md)
10. [FAQ](faq.md)
- beego簡介
- 為 beego 貢獻
- 發布版本
- 升級指南
- beego安裝升級
- Bee 工具的使用
- 快速入門
- 新建項目
- 路由設置
- Controller 運行機制
- model 邏輯
- view 編寫
- 靜態文件處理
- beego 的 MVC 架構介紹
- controller 設計
- 參數配置
- 路由設置
- 控制器函數
- XSRF 過濾
- 請求數據處理
- session 控制
- 過濾器
- flash 數據
- URL構建
- 多種格式數據輸出
- 表單數據驗證
- 錯誤處理
- 日志處理
- model設計
- 概述
- ORM 使用
- CRUD 操作
- 高級查詢
- 原生 SQL 查詢
- 構造查詢
- 事務處理
- 模型定義
- 命令模式
- 測試用例
- 自定義字段
- FAQ
- view 設計
- 模板語法指南
- 模板處理
- 模板函數
- 靜態文件處理
- 模板分頁處理
- beego 的模塊設計
- session 模塊
- grace 模塊
- cache 模塊
- logs 模塊
- httplib 模塊
- context 模塊
- toolbox 模塊
- config 模塊
- i18n 模塊
- beego 高級編程
- 進程內監控
- API 自動化文檔
- 應用部署
- 獨立部署
- supervisor 部署
- Nginx 部署
- apache 部署
- beego 第三方庫
- 應用例子
- 在線聊天室
- 短域名服務
- Todo 列表
- beego實用庫
- 驗證碼
- 分頁
- FAQ