imporved README

This commit is contained in:
Lunny Xiao 2013-05-11 21:27:36 +08:00
parent 3c887fdf62
commit 08f3a5f69b
2 changed files with 338 additions and 259 deletions

277
README.md
View File

@ -39,190 +39,223 @@ Drivers for Go's sql package which currently support database/sql includes:
1.Create a database engine just like sql.Open, commonly you just need create once.
```Go
import (_ "github.com/Go-SQL-Driver/MySQL"
"github.com/lunny/xorm")
import (
_ "github.com/Go-SQL-Driver/MySQL"
"github.com/lunny/xorm"
)
engine := xorm.Create("mysql", "root:123@/test?charset=utf8")
```
or
```Go
import (_ "github.com/mattn/go-sqlite3"
"github.com/lunny/xorm")
engine = xorm.Create("sqlite3", "./test.db")
import (
_ "github.com/mattn/go-sqlite3"
"github.com/lunny/xorm"
)
engine = xorm.Create("sqlite3", "./test.db")
```
2.Define a struct
type User struct {
Id int
Name string
Age int `xorm:"-"`
}
```Go
type User struct {
Id int
Name string
Age int `xorm:"-"`
}
```
3.When you set up your program, you can use CreateTables to create database tables.
err := engine.CreateTables(&User{})
// or err := engine.Map(&User{}, &Article{})
// err = engine.CreateAll()
```Go
err := engine.CreateTables(&User{})
// or err := engine.Map(&User{}, &Article{})
// err = engine.CreateAll()
```
4.then, insert an struct to table
id, err := engine.Insert(&User{Name:"lunny"})
```Go
id, err := engine.Insert(&User{Name:"lunny"})
```
or if you want to update records
user := User{Name:"xlw"}
rows, err := engine.Update(&user, &User{Id:1})
// or rows, err := engine.Where("id = ?", 1).Update(&user)
// or rows, err := engine.Id(1).Update(&user)
```Go
user := User{Name:"xlw"}
rows, err := engine.Update(&user, &User{Id:1})
// or rows, err := engine.Where("id = ?", 1).Update(&user)
// or rows, err := engine.Id(1).Update(&user)
```
5.Fetch a single object by user
var user = User{Id:27}
err := engine.Get(&user)
// or err := engine.Id(27).Get(&user)
```Go
var user = User{Id:27}
err := engine.Get(&user)
// or err := engine.Id(27).Get(&user)
var user = User{Name:"xlw"}
err := engine.Get(&user)
var user = User{Name:"xlw"}
err := engine.Get(&user)
```
6.Fetch multipe objects, use Find
var everyone []Userinfo
err := engine.Find(&everyone)
```Go
var everyone []Userinfo
err := engine.Find(&everyone)
```
6.1 also you can use Where, Limit
var allusers []Userinfo
err := engine.Where("id > ?", "3").Limit(10,20).Find(&allusers) //Get id>3 limit 10 offset 20
```Go
var allusers []Userinfo
err := engine.Where("id > ?", "3").Limit(10,20).Find(&allusers) //Get id>3 limit 10 offset 20
```
6.2 or you can use a struct query
var tenusers []Userinfo
err := engine.Limit(10).Find(&tenusers, &Userinfo{Name:"xlw"}) //Get All Name="xlw" limit 10 offset 0
```Go
var tenusers []Userinfo
err := engine.Limit(10).Find(&tenusers, &Userinfo{Name:"xlw"}) //Get All Name="xlw" limit 10 offset 0
```
6.3 or In function
var tenusers []Userinfo
err := engine.In("id", 1, 3, 5).Find(&tenusers) //Get All id in (1, 3, 5)
```Go
var tenusers []Userinfo
err := engine.In("id", 1, 3, 5).Find(&tenusers) //Get All id in (1, 3, 5)
```
7.Delete
err := engine.Delete(&User{Id:1})
// or err := engine.Id(1).Delete(&User{})
```Go
err := engine.Delete(&User{Id:1})
// or err := engine.Id(1).Delete(&User{})
```
8.Count
total, err := engine.Count(&User{Name:"xlw"})
```Go
total, err := engine.Count(&User{Name:"xlw"})
```
##Execute SQL
Of course, SQL execution is also provided.
1.if select then use Query
sql := "select * from userinfo"
results, err := engine.Query(sql)
```Go
sql := "select * from userinfo"
results, err := engine.Query(sql)
```
2.if insert, update or delete then use Exec
sql = "update userinfo set username=? where id=?"
res, err := engine.Exec(sql, "xiaolun", 1)
```Go
sql = "update userinfo set username=? where id=?"
res, err := engine.Exec(sql, "xiaolun", 1)
```
##Deep Use
for deep usage, you should create a session, this func will create a database connection immediatelly
session, err := engine.MakeSession()
defer session.Close()
if err != nil {
return
}
```Go
session, err := engine.MakeSession()
defer session.Close()
if err != nil {
return
}
```
1.Fetch a single object by where
var user Userinfo
session.Where("id=?", 27).Get(&user)
```Go
var user Userinfo
session.Where("id=?", 27).Get(&user)
var user2 Userinfo
session.Where("name = ?", "john").Get(&user3) // more complex query
var user3 Userinfo
session.Where("name = ? and age < ?", "john", 88).Get(&user4) // even more complex
var user2 Userinfo
session.Where("name = ?", "john").Get(&user3) // more complex query
var user3 Userinfo
session.Where("name = ? and age < ?", "john", 88).Get(&user4) // even more complex
```
2.Fetch multiple objects
var allusers []Userinfo
err := session.Where("id > ?", "3").Limit(10,20).Find(&allusers) //Get id>3 limit 10 offset 20
```Go
var allusers []Userinfo
err := session.Where("id > ?", "3").Limit(10,20).Find(&allusers) //Get id>3 limit 10 offset 20
var tenusers []Userinfo
err := session.Limit(10).Find(&tenusers, &Userinfo{Name:"xlw"}) //Get All Name="xlw" limit 10 if omit offset the default is 0
var tenusers []Userinfo
err := session.Limit(10).Find(&tenusers, &Userinfo{Name:"xlw"}) //Get All Name="xlw" limit 10 if omit offset the default is 0
var everyone []Userinfo
err := session.Find(&everyone)
var everyone []Userinfo
err := session.Find(&everyone)
```
3.Transaction
// add Begin() before any action
session.Begin()
user1 := Userinfo{Username: "xiaoxiao", Departname: "dev", Alias: "lunny", Created: time.Now()}
_, err = session.Insert(&user1)
if err != nil {
session.Rollback()
return
}
user2 := Userinfo{Username: "yyy"}
_, err = session.Where("id = ?", 2).Update(&user2)
if err != nil {
session.Rollback()
return
}
```Go
// add Begin() before any action
session.Begin()
user1 := Userinfo{Username: "xiaoxiao", Departname: "dev", Alias: "lunny", Created: time.Now()}
_, err = session.Insert(&user1)
if err != nil {
session.Rollback()
return
}
user2 := Userinfo{Username: "yyy"}
_, err = session.Where("id = ?", 2).Update(&user2)
if err != nil {
session.Rollback()
return
}
_, err = session.Delete(&user2)
if err != nil {
session.Rollback()
return
}
_, err = session.Delete(&user2)
if err != nil {
session.Rollback()
return
}
// add Commit() after all actions
err = session.Commit()
if err != nil {
return
}
// add Commit() after all actions
err = session.Commit()
if err != nil {
return
}
```
4.Mixed Transaction
// add Begin() before any action
session.Begin()
user1 := Userinfo{Username: "xiaoxiao", Departname: "dev", Alias: "lunny", Created: time.Now()}
_, err = session.Insert(&user1)
if err != nil {
session.Rollback()
return
}
user2 := Userinfo{Username: "yyy"}
_, err = session.Where("id = ?", 2).Update(&user2)
if err != nil {
session.Rollback()
return
}
```Go
// add Begin() before any action
session.Begin()
user1 := Userinfo{Username: "xiaoxiao", Departname: "dev", Alias: "lunny", Created: time.Now()}
_, err = session.Insert(&user1)
if err != nil {
session.Rollback()
return
}
user2 := Userinfo{Username: "yyy"}
_, err = session.Where("id = ?", 2).Update(&user2)
if err != nil {
session.Rollback()
return
}
_, err = session.Exec("delete from userinfo where username = ?", user2.Username)
if err != nil {
session.Rollback()
return
}
_, err = session.Exec("delete from userinfo where username = ?", user2.Username)
if err != nil {
session.Rollback()
return
}
// add Commit() after all actions
err = session.Commit()
if err != nil {
return
}
// add Commit() after all actions
err = session.Commit()
if err != nil {
return
}
```
##Mapping Rules
1.Struct and struct's fields name should be Pascal style, and the table and column's name default is SQL style.
@ -261,13 +294,15 @@ Another is use field tag, field tag support the below keywords which split with
For Example
type Userinfo struct {
Uid int `xorm:"id pk not null autoincr"`
Username string
Departname string
Alias string `xorm:"-"`
Created time.Time
}
```Go
type Userinfo struct {
Uid int `xorm:"id pk not null autoincr"`
Username string
Departname string
Alias string `xorm:"-"`
Created time.Time
}
```
##Documents
Please visit [GoWalker](http://gowalker.org/github.com/lunny/xorm)
@ -276,9 +311,11 @@ Please visit [GoWalker](http://gowalker.org/github.com/lunny/xorm)
Use space.
type User struct {
Name string `json:"name" xorm:"name"`
}
```Go
type User struct {
Name string `json:"name" xorm:"name"`
}
```
## LICENSE

View File

@ -37,185 +37,222 @@ xorm是一个Go语言的ORM库. 通过它可以使数据库操作非常简便。
1.创建数据库引擎这个函数的参数和sql.Open相同但不会立即创建连接 (例如: mysql)
import (_ "github.com/Go-SQL-Driver/MySQL"
"github.com/lunny/xorm")
engine := xorm.Create("mysql", "root:123@/test?charset=utf8")
```Go
import (
_ "github.com/Go-SQL-Driver/MySQL"
"github.com/lunny/xorm"
)
engine := xorm.Create("mysql", "root:123@/test?charset=utf8")
```
or
import (_ "github.com/mattn/go-sqlite3"
"github.com/lunny/xorm")
engine = xorm.Create("sqlite3", "./test.db")
```Go
import (
_ "github.com/mattn/go-sqlite3"
"github.com/lunny/xorm"
)
engine = xorm.Create("sqlite3", "./test.db")
```
2.定义一个结构体
type User struct {
Id int
Name string
Age int `xorm:"-"`
}
```Go
type User struct {
Id int
Name string
Age int `xorm:"-"`
}
```
3.在程序初始化时,可能会需要创建表
err := engine.CreateTables(&User{})
```Go
err := engine.CreateTables(&User{})
```
4.然后,可以将一个结构体作为一条记录插入到表中。
id, err := engine.Insert(&User{Name:"lunny"})
```Go
id, err := engine.Insert(&User{Name:"lunny"})
```
或者执行更新操作:
user := User{Name:"xlw"}
rows, err := engine.Update(&user, &User{Id:1})
// rows, err := engine.Where("id = ?", 1).Update(&user)
// or rows, err := engine.Id(1).Update(&user)
```Go
user := User{Name:"xlw"}
rows, err := engine.Update(&user, &User{Id:1})
// rows, err := engine.Where("id = ?", 1).Update(&user)
// or rows, err := engine.Id(1).Update(&user)
```
5.获取单个对象可以用Get方法
var user = User{Id:27}
err := engine.Get(&user)
// or err := engine.Id(27).Get(&user)
```Go
var user = User{Id:27}
err := engine.Get(&user)
// or err := engine.Id(27).Get(&user)
var user = User{Name:"xlw"}
err := engine.Get(&user)
var user = User{Name:"xlw"}
err := engine.Get(&user)
```
6.获取多个对象可以用Find方法
var everyone []Userinfo
err := engine.Find(&everyone)
```Go
var everyone []Userinfo
err := engine.Find(&everyone)
```
6.1 你也可以使用Where和Limit方法设定条件和查询数量
var allusers []Userinfo
err := engine.Where("id > ?", "3").Limit(10,20).Find(&allusers) //Get id>3 limit 10 offset 20
```Go
var allusers []Userinfo
err := engine.Where("id > ?", "3").Limit(10,20).Find(&allusers) //Get id>3 limit 10 offset 20
```
6.2 用一个结构体作为查询条件也是允许的
var tenusers []Userinfo
err := engine.Limit(10).Find(&tenusers, &Userinfo{Name:"xlw"}) //Get All Name="xlw" limit 10 offset 0
```Go
var tenusers []Userinfo
err := engine.Limit(10).Find(&tenusers, &Userinfo{Name:"xlw"}) //Get All Name="xlw" limit 10 offset 0
```
6.3 也可以调用In函数
var tenusers []Userinfo
err := engine.In("id", 1, 3, 5).Find(&tenusers) //Get All id in (1, 3, 5)
```Go
var tenusers []Userinfo
err := engine.In("id", 1, 3, 5).Find(&tenusers) //Get All id in (1, 3, 5)
```
7.Delete方法
err := engine.Delete(&User{Id:1})
// or err := engine.Id(1).Delete(&User{})
```Go
err := engine.Delete(&User{Id:1})
// or err := engine.Id(1).Delete(&User{})
```
8.Count方法
total, err := engine.Count(&User{Name:"xlw"})
```Go
total, err := engine.Count(&User{Name:"xlw"})
```
##直接执行SQL语句
当然如果你想直接使用SQL语句进行操作也是允许的。
如果执行Select请用Query()
sql := "select * from userinfo"
results, err := engine.Query(sql)
```Go
sql := "select * from userinfo"
results, err := engine.Query(sql)
```
如果执行Insert Update Delete 等操作请用Exec()
sql = "update userinfo set username=? where id=?"
res, err := engine.Exec(sql, "xiaolun", 1)
```Go
sql = "update userinfo set username=? where id=?"
res, err := engine.Exec(sql, "xiaolun", 1)
```
##高级用法
更高级的用法我们必须要使用session对象session对象在创建时会立刻创建一个数据库连接。
session, err := engine.MakeSession()
defer session.Close()
if err != nil {
return
}
```Go
session, err := engine.MakeSession()
defer session.Close()
if err != nil {
return
}
```
1.session对象同样也可以查询
var user Userinfo
session.Where("id=?", 27).Get(&user)
```Go
var user Userinfo
session.Where("id=?", 27).Get(&user)
var user2 Userinfo
session.Where("name = ?", "john").Get(&user3) // more complex query
var user3 Userinfo
session.Where("name = ? and age < ?", "john", 88).Get(&user4) // even more complex
var user2 Userinfo
session.Where("name = ?", "john").Get(&user3) // more complex query
var user3 Userinfo
session.Where("name = ? and age < ?", "john", 88).Get(&user4) // even more complex
```
2.获取多个对象
var allusers []Userinfo
err := session.Where("id > ?", "3").Limit(10,20).Find(&allusers) //Get id>3 limit 10 offset 20
```Go
var allusers []Userinfo
err := session.Where("id > ?", "3").Limit(10,20).Find(&allusers) //Get id>3 limit 10 offset 20
var tenusers []Userinfo
err := session.Limit(10).Find(&tenusers, &Userinfo{Name:"xlw"}) //Get All Name="xlw" limit 10 if omit offset the default is 0
var tenusers []Userinfo
err := session.Limit(10).Find(&tenusers, &Userinfo{Name:"xlw"}) //Get All Name="xlw" limit 10 if omit offset the default is 0
var everyone []Userinfo
err := session.Find(&everyone)
var everyone []Userinfo
err := session.Find(&everyone)
```
3.事务处理
// add Begin() before any action
session.Begin()
user1 := Userinfo{Username: "xiaoxiao", Departname: "dev", Alias: "lunny", Created: time.Now()}
_, err = session.Insert(&user1)
if err != nil {
session.Rollback()
return
}
user2 := Userinfo{Username: "yyy"}
_, err = session.Where("id = ?", 2).Update(&user2)
if err != nil {
session.Rollback()
return
}
```Go
// add Begin() before any action
session.Begin()
user1 := Userinfo{Username: "xiaoxiao", Departname: "dev", Alias: "lunny", Created: time.Now()}
_, err = session.Insert(&user1)
if err != nil {
session.Rollback()
return
}
user2 := Userinfo{Username: "yyy"}
_, err = session.Where("id = ?", 2).Update(&user2)
if err != nil {
session.Rollback()
return
}
_, err = session.Delete(&user2)
if err != nil {
session.Rollback()
return
}
_, err = session.Delete(&user2)
if err != nil {
session.Rollback()
return
}
// add Commit() after all actions
err = session.Commit()
if err != nil {
return
}
// add Commit() after all actions
err = session.Commit()
if err != nil {
return
}
```
4.混合型事务这个事务中既有直接的SQL语句又有其它方法:
4.混合型事务这个事务中既有直接的SQL语句又有ORM方法:
// add Begin() before any action
session.Begin()
user1 := Userinfo{Username: "xiaoxiao", Departname: "dev", Alias: "lunny", Created: time.Now()}
_, err = session.Insert(&user1)
if err != nil {
session.Rollback()
return
}
user2 := Userinfo{Username: "yyy"}
_, err = session.Where("id = ?", 2).Update(&user2)
if err != nil {
session.Rollback()
return
}
```Go
// add Begin() before any action
session.Begin()
user1 := Userinfo{Username: "xiaoxiao", Departname: "dev", Alias: "lunny", Created: time.Now()}
_, err = session.Insert(&user1)
if err != nil {
session.Rollback()
return
}
user2 := Userinfo{Username: "yyy"}
_, err = session.Where("id = ?", 2).Update(&user2)
if err != nil {
session.Rollback()
return
}
_, err = session.Exec("delete from userinfo where username = ?", user2.Username)
if err != nil {
session.Rollback()
return
}
_, err = session.Exec("delete from userinfo where username = ?", user2.Username)
if err != nil {
session.Rollback()
return
}
// add Commit() after all actions
err = session.Commit()
if err != nil {
return
}
// add Commit() after all actions
err = session.Commit()
if err != nil {
return
}
```
##映射规则
1.Struct 和 Struct 的field名字应该为Pascal式命名默认的映射规则将转换成用下划线连接的命名规则这个映射是自动进行的当然你可以通过修改Engine的成员Mapper来改变它。
@ -254,13 +291,15 @@ UserInfo中的成员UserName将会自动对应名为user_name的字段。
</table>
例如:
type Userinfo struct {
Uid int `xorm:"id pk not null autoincr"`
Username string
Departname string
Alias string `xorm:"-"`
Created time.Time
}
```Go
type Userinfo struct {
Uid int `xorm:"id pk not null autoincr"`
Username string
Departname string
Alias string `xorm:"-"`
Created time.Time
}
```
##文档
请访问 [GoWalker](http://gowalker.org/github.com/lunny/xorm) 查看详细文档
@ -270,14 +309,17 @@ UserInfo中的成员UserName将会自动对应名为user_name的字段。
答案:使用空格分开
type User struct {
Name string `json:"name" xorm:"name"`
}
```Go
type User struct {
Name string `json:"name" xorm:"name"`
}
```
2.问xorm是否带有连接池
答案database/sql默认就有连接池因此xorm本身没有内建连接池在使用过程中会自动调用database/sql的实现。
## LICENSE
BSD License
[http://creativecommons.org/licenses/BSD/](http://creativecommons.org/licenses/BSD/)
BSD License
[http://creativecommons.org/licenses/BSD/](http://creativecommons.org/licenses/BSD/)