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

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

View File

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