xorm/README_CN.md

267 lines
7.2 KiB
Markdown
Raw Normal View History

2013-05-16 06:12:27 +00:00
# xorm
2014-01-07 09:21:02 +00:00
2014-04-11 09:16:43 +00:00
[English](https://github.com/go-xorm/xorm/blob/master/README.md)
2014-01-07 09:21:02 +00:00
xorm是一个简单而强大的Go语言ORM库. 通过它可以使数据库操作非常简便。
2013-05-08 13:42:22 +00:00
2015-08-26 01:39:56 +00:00
[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/go-xorm/xorm?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
2014-10-20 02:06:45 +00:00
[![Build Status](https://drone.io/github.com/go-xorm/tests/status.png)](https://drone.io/github.com/go-xorm/tests/latest) [![Go Walker](http://gowalker.org/api/v1/badge)](http://gowalker.org/github.com/go-xorm/xorm)
2013-06-08 04:47:28 +00:00
2013-11-26 03:27:29 +00:00
## 特性
2013-09-24 17:31:25 +00:00
2013-11-26 03:27:29 +00:00
* 支持Struct和数据库表之间的灵活映射并支持自动同步
* 事务支持
* 同时支持原始SQL语句和ORM操作的混合执行
* 使用连写来简化调用
* 支持使用Id, In, Where, Limit, Join, Having, Table, Sql, Cols等函数和结构体等方式作为条件
2015-12-30 08:49:46 +00:00
* 支持级联加载Struct
2013-11-26 03:27:29 +00:00
* 支持缓存
* 支持根据数据库自动生成xorm的结构体
2013-09-11 08:30:17 +00:00
* 支持记录版本(即乐观锁)
2013-05-16 06:12:27 +00:00
## 驱动支持
2014-01-07 09:21:02 +00:00
目前支持的Go数据库驱动和对应的数据库如下
* Mysql: [github.com/go-sql-driver/mysql](https://github.com/go-sql-driver/mysql)
* MyMysql: [github.com/ziutek/mymysql/godrv](https://github.com/ziutek/mymysql/godrv)
2013-11-06 07:43:30 +00:00
* Postgres: [github.com/lib/pq](https://github.com/lib/pq)
2015-09-24 14:49:14 +00:00
* Tidb: [github.com/pingcap/tidb](https://github.com/pingcap/tidb)
* SQLite: [github.com/mattn/go-sqlite3](https://github.com/mattn/go-sqlite3)
2014-07-01 07:38:05 +00:00
* MsSql: [github.com/denisenkom/go-mssqldb](https://github.com/denisenkom/go-mssqldb)
2013-12-31 06:33:02 +00:00
* MsSql: [github.com/lunny/godbc](https://github.com/lunny/godbc)
2015-04-01 13:53:17 +00:00
* Oracle: [github.com/mattn/go-oci8](https://github.com/mattn/go-oci8) (试验性支持)
2015-09-24 14:49:14 +00:00
* ql: [github.com/cznic/ql](https://github.com/cznic/ql) (试验性支持)
2013-05-11 10:38:43 +00:00
## 更新日志
2014-01-02 09:48:57 +00:00
* **v0.4.5**
* bug修正
* extends 支持无限级
* Delete Limit 支持
2015-09-24 14:49:14 +00:00
* **v0.4.4**
* Tidb 数据库支持
* QL 试验性支持
* sql.NullString支持
* ForUpdate 支持
* bug修正
2015-12-30 08:49:46 +00:00
2014-11-12 15:42:36 +00:00
[更多更新日志...](https://github.com/go-xorm/manual-zh-CN/tree/master/chapter-16)
2014-01-07 09:21:02 +00:00
2013-05-08 13:42:22 +00:00
## 安装
2015-12-30 08:49:46 +00:00
推荐使用 [gopm](https://github.com/gpmgo/gopm) 进行安装:
2013-12-01 03:08:17 +00:00
2014-04-11 09:16:43 +00:00
gopm get github.com/go-xorm/xorm
2015-12-30 08:49:46 +00:00
2013-12-01 03:08:17 +00:00
或者您也可以使用go工具进行安装
2014-04-11 09:16:43 +00:00
go get github.com/go-xorm/xorm
2014-01-07 09:21:02 +00:00
2013-09-24 17:31:25 +00:00
## 文档
2014-01-07 09:21:02 +00:00
2014-10-19 06:41:47 +00:00
* [操作指南](http://xorm.io/docs)
2013-05-11 10:38:43 +00:00
2014-04-11 09:16:43 +00:00
* [GoWalker代码文档](http://gowalker.org/github.com/go-xorm/xorm)
2013-09-24 17:31:25 +00:00
2014-04-11 09:16:43 +00:00
* [Godoc代码文档](http://godoc.org/github.com/go-xorm/xorm)
2013-11-26 03:27:29 +00:00
2015-12-30 08:49:46 +00:00
# 快速开始
2015-12-30 08:58:58 +00:00
* 第一步创建引擎driverName, dataSourceName和database/sql接口相同
2015-12-30 08:49:46 +00:00
```Go
engine, err := xorm.NewEngine(driverName, dataSourceName)
```
2015-12-30 08:58:58 +00:00
* 定义一个和表同步的结构体,并且自动同步结构体到数据库
2015-12-30 08:49:46 +00:00
```Go
type User struct {
Id int64
Name string
Salt string
Age int
Passwd string `xorm:"varchar(200)"`
Created time.Time `xorm:"created"`
Updated time.Time `xorm:"updated"`
}
err := engine.Sync2(new(User))
```
2015-12-30 08:58:58 +00:00
* 最原始的也支持SQL语句查询返回的结果类型为 []map[string][]byte
2015-12-30 08:49:46 +00:00
```Go
results, err := engine.Query("select * from user")
```
2015-12-30 08:58:58 +00:00
* 执行一个SQL语句
2015-12-30 08:49:46 +00:00
```Go
affected, err := engine.Exec("update user set age = ? where name = ?", age, name)
```
2015-12-30 08:58:58 +00:00
* 插入一条或者多条记录
2015-12-30 08:49:46 +00:00
```Go
affected, err := engine.Insert(&user)
// INSERT INTO struct () values ()
affected, err := engine.Insert(&user1, &user2)
// INSERT INTO struct1 () values ()
// INSERT INTO struct2 () values ()
affected, err := engine.Insert(&users)
// INSERT INTO struct () values (),(),()
affected, err := engine.Insert(&user1, &users)
// INSERT INTO struct1 () values ()
// INSERT INTO struct2 () values (),(),()
```
2015-12-30 08:58:58 +00:00
* 查询单条记录
2015-12-30 08:49:46 +00:00
```Go
has, err := engine.Get(&user)
// SELECT * FROM user LIMIT 1
has, err := engine.Where("name = ?", name).Desc("id").Get(&user)
// SELECT * FROM user WHERE name = ? ORDER BY id DESC LIMIT 1
```
2015-12-30 08:58:58 +00:00
* 查询多条记录当然可以使用Join和extends来组合使用
2015-12-30 08:49:46 +00:00
```Go
2015-12-30 08:58:58 +00:00
var users []User
err := engine.Where("name = ?", name).And("age > 10").Limit(10, 0).Find(&users)
// SELECT * FROM user WHERE name = ? AND age > 10 limit 0 offset 10
type Detail struct {
Id int64
UserId int64 `xorm:"index"`
}
type UserDetail struct {
User `xorm:"extends"`
Detail `xorm:"extends"`
}
var users []UserDetail
err := engine.Table("user").Select("user.*, detail.*")
Join("INNER", "detail", "detail.user_id = user.id").
Where("user.name = ?", name).Limit(10, 0).
Find(&users)
// SELECT user.*, detail.* FROM user INNER JOIN detail WHERE user.name = ? limit 0 offset 10
2015-12-30 08:49:46 +00:00
```
2015-12-30 08:58:58 +00:00
* 根据条件遍历数据库,可以有两种方式: Iterate and Rows
2015-12-30 08:49:46 +00:00
```Go
err := engine.Iterate(&User{Name:name}, func(idx int, bean interface{}) error {
user := bean.(*User)
return nil
})
// SELECT * FROM user
rows, err := engine.Rows(&User{Name:name})
// SELECT * FROM user
defer rows.Close()
bean := new(Struct)
for rows.Next() {
err = rows.Scan(bean)
}
```
2015-12-30 08:58:58 +00:00
* 更新数据除非使用Cols,AllCols函数指明默认只更新非空和非0的字段
2015-12-30 08:49:46 +00:00
```Go
affected, err := engine.Id(1).Update(&user)
// UPDATE user SET ... Where id = ?
affected, err := engine.Update(&user, &User{Name:name})
// UPDATE user SET ... Where name = ?
var ids = []int64{1, 2, 3}
affected, err := engine.In(ids).Update(&user)
// UPDATE user SET ... Where id IN (?, ?, ?)
// force update indicated columns by Cols
affected, err := engine.Id(1).Cols("age").Update(&User{Name:name, Age: 12})
// UPDATE user SET age = ?, updated=? Where id = ?
// force NOT update indicated columns by Omit
affected, err := engine.Id(1).Omit("name").Update(&User{Name:name, Age: 12})
// UPDATE user SET age = ?, updated=? Where id = ?
affected, err := engine.Id(1).AllCols().Update(&user)
// UPDATE user SET name=?,age=?,salt=?,passwd=?,updated=? Where id = ?
```
2015-12-30 08:58:58 +00:00
* 删除记录需要注意删除必须至少有一个条件否则会报错。要清空数据库可以用EmptyTable
2015-12-30 08:49:46 +00:00
```Go
affected, err := engine.Where(...).Delete(&user)
// DELETE FROM user Where ...
```
2015-12-30 08:58:58 +00:00
* 获取记录条数
2015-12-30 08:49:46 +00:00
```Go
counts, err := engine.Count(&user)
// SELECT count(*) AS total FROM user
```
# 案例
2013-05-16 06:12:27 +00:00
2015-05-26 08:27:18 +00:00
* [github.com/m3ng9i/qreader](https://github.com/m3ng9i/qreader)
2015-02-18 00:58:07 +00:00
* [Wego](http://github.com/go-tango/wego)
2014-11-13 01:19:03 +00:00
* [Docker.cn](https://docker.cn/)
2014-03-27 14:16:06 +00:00
* [Gogs](http://try.gogits.org) - [github.com/gogits/gogs](http://github.com/gogits/gogs)
2013-11-15 03:04:48 +00:00
* [Gowalker](http://gowalker.org) - [github.com/Unknwon/gowalker](http://github.com/Unknwon/gowalker)
2014-02-12 07:10:37 +00:00
* [Gobuild.io](http://gobuild.io) - [github.com/shxsun/gobuild](http://github.com/shxsun/gobuild)
* [Sudo China](http://sudochina.com) - [github.com/insionng/toropress](http://github.com/insionng/toropress)
* [Godaily](http://godaily.org) - [github.com/govc/godaily](http://github.com/govc/godaily)
2014-10-27 04:06:59 +00:00
* [YouGam](http://www.yougam.com/)
2014-01-07 09:21:02 +00:00
2014-03-27 14:16:06 +00:00
* [GoCMS - github.com/zzboy/GoCMS](https://github.com/zzdboy/GoCMS)
2014-04-13 06:32:21 +00:00
* [GoBBS - gobbs.domolo.com](http://gobbs.domolo.com/)
2014-10-28 02:37:37 +00:00
* [go-blog](http://wangcheng.me) - [github.com/easykoo/go-blog](https://github.com/easykoo/go-blog)
2014-04-13 06:32:21 +00:00
2013-11-26 03:27:29 +00:00
## 讨论
2013-05-08 13:42:22 +00:00
2013-11-26 03:27:29 +00:00
请加入QQ群280360085 进行讨论。
2013-05-08 13:42:22 +00:00
2014-04-23 06:57:40 +00:00
## 贡献
2013-12-08 13:40:58 +00:00
2014-04-11 09:16:43 +00:00
如果您也想为Xorm贡献您的力量请查看 [CONTRIBUTING](https://github.com/go-xorm/xorm/blob/master/CONTRIBUTING.md)
2013-12-31 06:33:02 +00:00
2014-01-07 09:21:02 +00:00
## LICENSE
BSD License
[http://creativecommons.org/licenses/BSD/](http://creativecommons.org/licenses/BSD/)