[TOC] # RegisterDriver驱动的名字 三种默认数据库类型 ~~~ // For version 1.6 orm.DRMySQL orm.DRSqlite orm.DRPostgres // < 1.6 orm.DR_MySQL orm.DR_Sqlite orm.DR_Postgres ~~~ # 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) ~~~ **SetMaxIdleConns** 根据数据库的别名,设置数据库的最大空闲连接 ~~~ orm.SetMaxIdleConns("default", 30) ~~~ **SetMaxOpenConns** 根据数据库的别名,设置数据库的最大数据库连接 (go >= 1.2) ~~~ orm.SetMaxOpenConns("default", 30) ~~~ # 时区设置 ~~~ orm.DefaultTimeLoc = time.PRC ~~~ 也可以这样 ~~~ root:root@/orm_test?charset=utf8&loc=Asia%2FShanghai ~~~ # 注册模型 如果使用 orm.QuerySeter 进行高级查询的话,这个是必须的。 反之,如果只使用 Raw 查询和 map struct,是无需这一步的 ## RegisterModel注册 将你定义的 Model 进行注册,最佳设计是有单独的 models.go 文件,在他的 init 函数中进行注册 RegisterModel 也可以同时注册多个 model ~~~ orm.RegisterModel(new(User), new(Profile), new(Post)) ~~~ ### RegisterModelWithPrefix表前缀 使用表名前缀 ~~~ orm.RegisterModelWithPrefix("prefix_", new(User)) ~~~ 创建后的表名为 prefix\_user ### NewOrmWithDB创建连接并使用orm 有时候需要自行管理连接池与数据库链接(比如: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") } ~~~ # 库的操作 使用 ORM 必然接触的 Ormer 接口,我们来熟悉一下 ~~~ var o orm.Ormer o = orm.NewOrm() // 创建一个 Ormer // NewOrm 的同时会执行 orm.BootStrap (整个 app 只执行一次),用以验证模型之间的定义并缓存。 ~~~ 切换数据库,或者,进行事务处理,都会作用于这个 Ormer 对象,以及其进行的任何查询。 所以:需要**切换数据库**和**事务处理**的话,不要使用全局保存的 Ormer 对象 ## 切换库 **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 ## 直接使用sql **Raw** 使用 sql 语句直接进行操作 Raw 函数,返回一个RawSete用以对设置的 sql 语句和参数进行操作 ~~~ o := orm.NewOrm() var r orm.RawSeter r = o.Raw("UPDATE user SET name = ? WHERE name = ?", "testing", "slene") ~~~ ## 验证db信息 **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 打印查询的语句 可能存在性能问题,不建议使用在生产模式 ~~~ func main() { orm.Debug = true ... ~~~ 默认使用 os.Stderr 输出日志信息 改变输出到你自己的 io.Writer ~~~ var w io.Writer ... // 设置为你的 io.Writer ... orm.DebugLog = orm.NewLog(w) ~~~ 日志格式 ~~~ [ORM] - 时间 - [Queries/数据库名] - [执行操作/执行时间] - [SQL语句] - 使用标点 `,` 分隔的参数列表 - 打印遇到的错误 ~~~