先来看一个简单示例:

models.gp

package main

import (
"github.com/astaxie/beego/orm"
) type User struct {
Id int
Name string
Profile *Profile `orm:"rel(one)"` // OneToOne relation
Post []*Post `orm:"reverse(many)"` // 设置一对多的反向关系
} type Profile struct {
Id int
Age int16
User *User `orm:"reverse(one)"` // 设置一对一反向关系(可选)
} type Post struct {
Id int
Title string
User *User `orm:"rel(fk)"` //设置一对多关系
Tags []*Tag `orm:"rel(m2m)"`
} type Tag struct {
Id int
Name string
Posts []*Post `orm:"reverse(many)"`
} func init() {
// 需要在init中注册定义的model
orm.RegisterModel(new(User), new(Post), new(Profile), new(Tag))
}

main.go

package main

import (
"fmt"
"github.com/astaxie/beego/orm"
_ "github.com/go-sql-driver/mysql"
) func init() {
orm.RegisterDriver("mysql", orm.DRMySQL) //数据库类型设计 orm.RegisterDataBase("default", "mysql", "root:root@/orm_test?charset=utf8")
} func main() {
o := orm.NewOrm()
o.Using("default") // 默认使用 default,你可以指定为其他数据库 profile := new(Profile)
profile.Age = 30 user := new(User)
user.Profile = profile
user.Name = "slene" fmt.Println(o.Insert(profile))
fmt.Println(o.Insert(user))
}

 

一、数据库的设置 

目前beego ORM支持三种数据库,已经经过基本测试。

import (
_ "github.com/go-sql-driver/mysql"
_ "github.com/lib/pq"
_ "github.com/mattn/go-sqlite3"
)

  

RegisterDriver

三种默认数据库类型的版本设置

// For version 1.6
orm.DRMySQL
orm.DRSqlite
orm.DRPostgres // < 1.6
orm.DR_MySQL
orm.DR_Sqlite
orm.DR_Postgres
// 参数1   驱动名称
// 参数2 数据库类型
// 这个用来设置 driverName 对应的数据库类型
// mysql / sqlite3 / postgres 这三种是默认已经注册过的,所以可以无需设置
orm.RegisterDriver("mysql", orm.DRMySQL)

  

RegisterDataBase

ORM必须注册一个别名为default的数据库,作为默认使用。ORM使用golang自己的连接池。

// 参数1        数据库的别名,用来在 ORM 中切换数据库使用
// 参数2 driverName
// 参数3 对应的链接字符串
orm.RegisterDataBase("default", "mysql", "root:root@/orm_test?charset=utf8") // 参数4(可选) 设置最大空闲连接
// 参数5(可选) 设置最大数据库连接 (go >= 1.2)
maxIdle := 30
maxConn := 30
orm.RegisterDataBase("default", "mysql", "root:root@/orm_test?charset=utf8", maxIdle, maxConn)

SetMaxldelConns

根据数据库的别名,设置数据库的最大空闲连接,这个值也可以在RegisterDateBase中设置。

orm.SetMaxIdleConns("default", 30)

  

SetMaxOpenConns

根据数据库的别名,设置数据库的最大数据库连接,这个值也可以在RegisterDateBase中设置。

orm.SetMaxOpenConns("default", 30)

  

时区设置

ORM默认使用time.Local本地时区,用于ORM自动创建的时间,也可以是从数据库中取回的时间转换成ORM本地时间。

如果需要的话,可以进行更改:

// 设置为 UTC 时间
orm.DefaultTimeLoc = time.UTC

  

ORM在进行RegisterDataBase的同时,会获取数据库使用的时区,然后在time.Time类型存取时做相应转换,以匹配时间系统,从而保证时间不会出错。

注意:

  • 鉴于Sqlite3的设计,存取默认的默认都是UTC时间
  • 使用go-sql-driver驱动时,需要注意参数设置。从某一版本开始,驱动默认使用UTC时间,而非本地时间,所以需要指定时区参数或全部以UTC时间存取。例如root:root@/orm_test?charset=utf8&loc=Asia%2FShanghai

二、注册模型

如果使用orm.QuerySeter进行高级查询的话,这个是必须的。

反之,如果只使用Raw查询和map struct,是无需这一步的。

注册就是让ORM语句转化为sql语句并写进数据库。

RegisterModel

将你定义的model进行注册,最佳设计是由单独的models.go文件,在他的init函数中进行注册。

package main

import "github.com/astaxie/beego/orm"

type User struct {
Id int
Name string
} func init(){
orm.RegisterModel(new(User))
}

RegisterModel也可以同时注册多个model。

orm.RegisterModel(new(User), new(Profile), new(Post))

  

RegisterModelWithPrefix

使用表名前缀

orm.RegisterModelWithPrefix("prefix_", new(User))

创建后的表名为prefix_user.

NewOrmWithDB

有时候需要自行管理连接池与数据库连接(比如:go的链接池也无法让两次查询使用同一个链接的),但又想使用ORM的查询功能

var driverName, aliasName string
// driverName 是驱动的名称
// aliasName 是当前 db 的自定义别名
var db *sql.DB
...
o := orm.NewOrmWithDB(driverName, aliasName, db)

  

GetDB

从已注册的数据库返回*sql.DB对象,默认返回别名为default的数据库。

db, err := orm.GetDB()
if err != nil {
fmt.Println("get default DataBase")
} db, err := orm.GetDB("alias")
if err != nil {
fmt.Println("get alias DataBase")
}

  

ResetModelCache

重置已经注册的模型struct,一般用于编写测试用例

orm.ResetModelCache()

  

三、ORM接口使用

使用ORM必然接触的Ormer接口

var o orm.Ormer
o = orm.NewOrm() // 创建一个 Ormer
// NewOrm 的同时会执行 orm.BootStrap (整个 app 只执行一次),用以验证模型之间的定义并缓存。

切换数据库,或者进行事务处理,都会作用于这个Ormer对象,以及其进行的任何查询。  

所以:需要切换数据库和事务处理的话,不要使用全局保存的Ormer对象。

type Ormer interface {

  • Read(interface{}, …string) error
  • ReadOrCreate(interface{}, string, …string) (bool, int64, error)
  • Insert(interface{}) (int64, error)
  • InsertMulti(int, interface{}) (int64, error)
  • Update(interface{}, …string) (int64, error)
  • Delete(interface{}) (int64, error)
  • LoadRelated(interface{}, string, …interface{}) (int64, error)
  • QueryM2M(interface{}, string) QueryM2Mer
  • QueryTable(interface{}) QuerySeter
  • Using(string) error
  • Begin() error
  • Commit() error
  • Rollback() error
  • Raw(string, …interface{}) RawSeter
  • Driver() Driver

}

QueryTable

传入表名,或者Model对象,返回一个QuerySeter

o := orm.NewOrm()
var qs orm.QuerySeter
qs = o.QueryTable("user")
// 如果表没有定义过,会立刻 panic

  

Using

切换为其它数据库

orm.RegisterDataBase("db1", "mysql", "root:root@/orm_db2?charset=utf8")
orm.RegisterDataBase("db2", "sqlite3", "data.db") o1 := orm.NewOrm()
o1.Using("db1") o2 := orm.NewOrm()
o2.Using("db2") // 切换为其他数据库以后
// 这个 Ormer 对象的其下的 api 调用都将使用这个数据库

默认使用default数据库,需要调用Using。

Raw

使用sql语句直接进行操作

Raw函数,返回一个RawSeter用以对设置的sql语句和参数进行操作

o := orm.NewOrm()
var r orm.RawSeter
r = o.Raw("UPDATE user SET name = ? WHERE name = ?", "testing", "slene")

  

Driver

返回当前ORM使用的db信息

type Driver interface {
Name() string
Type() DriverType
}
orm.RegisterDataBase("db1", "mysql", "root:root@/orm_db2?charset=utf8")
orm.RegisterDataBase("db2", "sqlite3", "data.db") o1 := orm.NewOrm()
o1.Using("db1")
dr := o1.Driver()
fmt.Println(dr.Name() == "db1") // true
fmt.Println(dr.Type() == orm.DRMySQL) // true o2 := orm.NewOrm()
o2.Using("db2")
dr = o2.Driver()
fmt.Println(dr.Name() == "db2") // true
fmt.Println(dr.Type() == orm.DRSqlite) // true

  

四、调试模式打印查询语句

简单的设置Debug为true打印查询语句。

orm.Debug = true

默认使用os.Stderr输出日志信息

改变输出到你自己的io.Writer  

var w io.Writer
...
// 设置为你的 io.Writer
...
orm.DebugLog = orm.NewLog(w)

 

日志格式

[ORM] - 时间 - [Queries/数据库名] - [执行操作/执行时间] - [SQL语句] - 使用标点 `,` 分隔的参数列表 - 打印遇到的错误

输出示例:

[ORM] - 2013-08-09 13:18:16 - [Queries/default] - [    db.Exec /     0.4ms] - [INSERT INTO `user` (`name`) VALUES (?)] - `slene`
[ORM] - 2013-08-09 13:18:16 - [Queries/default] - [ db.Exec / 0.5ms] - [UPDATE `user` SET `name` = ? WHERE `id` = ?] - `astaxie`, `14`
[ORM] - 2013-08-09 13:18:16 - [Queries/default] - [db.QueryRow / 0.4ms] - [SELECT `id`, `name` FROM `user` WHERE `id` = ?] - `14`
[ORM] - 2013-08-09 13:18:16 - [Queries/default] - [ db.Exec / 0.4ms] - [INSERT INTO `post` (`user_id`,`title`,`content`) VALUES (?, ?, ?)] - `14`, `beego orm`, `powerful amazing`
[ORM] - 2013-08-09 13:18:16 - [Queries/default] - [ db.Query / 0.4ms] - [SELECT T1.`name` `User__Name`, T0.`user_id` `User`, T1.`id` `User__Id` FROM `post` T0 INNER JOIN `user` T1 ON T1.`id` = T0.`user_id` WHERE T0.`id` = ? LIMIT 1000] - `68`
[ORM] - 2013-08-09 13:18:16 - [Queries/default] - [ db.Exec / 0.4ms] - [DELETE FROM `user` WHERE `id` = ?] - `14`
[ORM] - 2013-08-09 13:18:16 - [Queries/default] - [ db.Query / 0.3ms] - [SELECT T0.`id` FROM `post` T0 WHERE T0.`user_id` IN (?) ] - `14`
[ORM] - 2013-08-09 13:18:16 - [Queries/default] - [ db.Exec / 0.4ms] - [DELETE FROM `post` WHERE `id` IN (?)] - `68`

日志内容包括所有的数据库操作,事务,prepare等。

beego——ORM使用方法的更多相关文章

  1. [Beego模型] 一、ORM 使用方法

    [Beego模型] 一.ORM 使用方法 [Beego模型] 二.CRUD 操作 [Beego模型] 三.高级查询 [Beego模型] 四.使用SQL语句进行查询 [Beego模型] 五.构造查询 [ ...

  2. beego orm commonDAL通用方法汇总

    orm 通用方法——QueryModelById 主键查询 orm 通用方法——GetOneModel 条件查询一个对象 orm 通用方法——QueryModelCount条件查询记录数 orm 通用 ...

  3. beego orm mysql

    beego框架中的rom支持mysql 项目中使用到mvc模式,总结下使用方式: models中 package models import ( //使用beego orm 必备 "gith ...

  4. beego orm 忽略字段

    忽略字段 设置 - 即可忽略 struct 中的字段 type User struct { ... AnyField string `orm:"-"` ... } beego or ...

  5. golang学习笔记16 beego orm 数据库操作

    golang学习笔记16 beego orm 数据库操作 beego ORM 是一个强大的 Go 语言 ORM 框架.她的灵感主要来自 Django ORM 和 SQLAlchemy. 目前该框架仍处 ...

  6. 基于beego orm 针对oracle定制

    目前golang的ORM对oracle支持都没有mysql那样完整,一个orm要同时兼容mysql和oracle由于在sql语法上区别,会使整orm变的非常臃肿. 本项目是在beego orm上修改, ...

  7. Golang beego ORM + CRUP 操作详解

      构建beego Web 项目         首先构建一个beego 的web 项目,这个我们完全可以参考beego 官网中的开发文档,上面介绍的非常的详细,在这我就不给大家介绍,主要是介绍ORM ...

  8. beego orm操作mysql数据库

    慢慢弄起来~~ 按官方操作文档试一下. 那个err重复和user编号问题,以后再弄.. package main import ( "fmt" "github.com/a ...

  9. beego orm

    http://beego.me/docs/mvc/model/overview.md go get github.com/astaxie/beego/orm Simple Usage package ...

随机推荐

  1. JVM Specification 9th Edition (4) Chapter 3. Compiling for the Java Virtual Machine

    Chapter 3. Compiling for the Java Virtual Machine 内容列表 3.1. Format of Examples 3.2. Use of Constants ...

  2. OkHttp+Stetho+Chrome调试android网络部分(原创)

    android网络调试一直是一个比较麻烦的部分,因为在不同序列的请求中,返回的数据会有不同的变化,如果能像web开发一样使用调试功能查看页面的访问数据该是多么美好的事情! 很幸运的是,现在Androi ...

  3. 2016-2017 ACM-ICPC CHINA-Final Ice Cream Tower 二分+贪心

    /** 题目:2016-2017 ACM-ICPC CHINA-Final Ice Cream Tower 链接:http://codeforces.com/gym/101194 题意:给n个木块,堆 ...

  4. 《linux系统及其编程》实验课记录(一)

    实验 1:登录和使用基本的 Linux 命令 实验环境: 安装了 Red Hat Enterprise Linux 6.0 可运行系统,并且是成功验证系统. 有另外一个无特权用户 student,密码 ...

  5. The Boost C++ Libraries中文教程

    http://zh.highscore.de/cpp/boost/

  6. WPF实用知识点

    1.一个基本的WPF程序, 需要引入的程序集WindowsBase, PresentationCore, PresentationFramework using System; using Syste ...

  7. CentOS 7安装与配置jdk-8u162

    一.下载jdk-8u162版本 jdk-8u162-linux-x64.rpm 二.上传jdk到centos下 上传完后的文件如下,文件只有读写权限,没有执行权限 使用如下命令授权,如果文件已经有了执 ...

  8. c++ wchar_t

    ·C语言相关 对应于char, C语言中也有宽字符内型wchar_t.wchar_t被定义为: typedef unsigned short wchar_t ;显然它是16位的.wchar_t类型的常 ...

  9. iOS 状态栏更改为白色

    如果觉得在iOS 7启动期间状态栏黑色不合你意,以下方法可改变Status bar style成白色 在工程的plist添加 Status bar style,改变style值 默认是Gray sty ...

  10. Windows窗口的层次关系(转)

    今天看到这篇文章,觉得蛮有用的,我之前也对这个不大了解,特转载此处. 转载地址:http://www.51testing.com/html/200804/n80848.html 在Window 的图形 ...