安徽茶叶商城网站建设全部视频支持代表手机浏览器
xorm
xorm是一个简单而强大的Go语言ORM库通过它可以使数据库操作非常简便。
官网: https://xorm.io/
中文文档: https://gitea.com/xorm/xorm/src/branch/master/README_CN.md
特性
- 支持 Struct 和数据库表之间的灵活映射,并支持自动同步
- 事务支持
- 同时支持原始SQL语句和ORM操作的混合执行
- 使用连写来简化调用。
- 支持使用ID,In,Where, Limit,Join,Having,Table, SQL,Cols等函数和结构体等方式作为条件
- …
安装
go get xorm.io/xorm
同步结构体到数据库
package mainimport ("fmt"_ "github.com/go-sql-driver/mysql""time""xorm.io/xorm"
)func main() {//初始化数据库连接信息var (userName = "root"passWord = "xxxxx"ipAddress = "127.0.0.1"port = 3306dbName = "poem_noun"charset = "utf8mb4")dataSourceName := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s", userName, passWord, ipAddress, port, dbName, charset)//创建引擎,driverName, dataSourceName 和 database/sql 接口相同engine, err := xorm.NewEngine("mysql", dataSourceName)if err != nil {fmt.Println("数据库连接失败")}//定义一个和表同步的结构体,并且自动同步结构体到数据库type User struct {Id int64Name stringAge intPasswd string `xorm:"varchar(200)"`Created time.Time `xorm:"created"`Updated time.Time `xorm:"updated"`}err = engine.Sync(new(User))if err != nil {println("表结构同步失败")}}
注:后续需要增加表的字段只需要在结构体中新增对应字段,然后执行改代码,即可把字段同步至数据库。
数据插入
package mainimport ("fmt"_ "github.com/go-sql-driver/mysql""time""xorm.io/xorm"
)func main() {//初始化数据库连接信息var (userName = "root"passWord = "xxxxx"ipAddress = "127.0.0.1"port = 3306dbName = "poem_noun"charset = "utf8mb4")dataSourceName := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s", userName, passWord, ipAddress, port, dbName, charset)//创建引擎,driverName, dataSourceName 和 database/sql 接口相同engine, err := xorm.NewEngine("mysql", dataSourceName)if err != nil {fmt.Println("数据库连接失败")}type User struct {Id int64Name stringAge intPasswd string `xorm:"varchar(200)"`Created time.Time `xorm:"created"`Updated time.Time `xorm:"updated"`}user := User{Id: 1,Name: "wk",Age: 18,Passwd: "wwwwwwww",}//插入单挑affected, err := engine.Insert(&user)if affected >= 1 {println("数据插入成功")}//定义切片var users []Userusers = append(users, User{Id: 2,Name: "wk",Age: 18,Passwd: "wwwwwwww",})users = append(users, User{Id: 3,Name: "wk",Age: 18,Passwd: "wwwwwwww",})//插入切片affected, err = engine.Insert(&users)
}
更新和删除
- Update更新数据,默认只更新非空和非0的字段 。
- Delete 删除记录,需要注意,删除必须至少有一个条件,否则会报错。
- Exec 执行一个SQL语句
package mainimport ("fmt"_ "github.com/go-sql-driver/mysql""time""xorm.io/xorm"
)func main() {//初始化数据库连接信息var (userName = "root"passWord = "xxxxx"ipAddress = "127.0.0.1"port = 3306dbName = "poem_noun"charset = "utf8mb4")dataSourceName := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s", userName, passWord, ipAddress, port, dbName, charset)//创建引擎,driverName, dataSourceName 和 database/sql 接口相同engine, err := xorm.NewEngine("mysql", dataSourceName)if err != nil {fmt.Println("数据库连接失败")}type User struct {Id int64Name stringAge intPasswd string `xorm:"varchar(200)"`Created time.Time `xorm:"created"`Updated time.Time `xorm:"updated"`}user := User{Name: "cs",}//更新一条数据_, err = engine.ID(1).Update(&user)user = User{Name: "wk",}//删除一条数据_, err = engine.ID(3).Delete(&user)//直接执行sqlengine.Exec("update user set name = ? where id = ?", "ddddddd", 2)}
数据查询
- Query 最原始的也支持SQL语句查询,返回的结果类型为 []map[string] []byte。Querystring 返回 []map[string]string
- QueryInterface 返回 []map[string]interface{}
- Get 查询单条记录
- Find 查询多条记录
- Count 获取记录条数
- Iterate 和 Rows 根据条件遍历数据
package mainimport ("fmt"_ "github.com/go-sql-driver/mysql""time""xorm.io/xorm"
)func main() {//初始化数据库连接信息var (userName = "root"passWord = "xxxxxx"ipAddress = "127.0.0.1"port = 3306dbName = "poem_noun"charset = "utf8mb4")dataSourceName := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s", userName, passWord, ipAddress, port, dbName, charset)//创建引擎,driverName, dataSourceName 和 database/sql 接口相同engine, err := xorm.NewEngine("mysql", dataSourceName)if err != nil {fmt.Println("数据库连接失败")}type User struct {Id int64Name stringAge intPasswd string `xorm:"varchar(200)"`Created time.Time `xorm:"created"`Updated time.Time `xorm:"updated"`}//查询result, err := engine.Query("select * from user")fmt.Println(result)result2, err := engine.QueryString("select * from user")fmt.Println(result2)result3, err := engine.QueryInterface("select * from user")fmt.Println(result3)//Get查询方法user := User{}engine.Get(&user)fmt.Println(user)//指定条件来查询用户user1 := User{Name: "cs"}engine.Where("name=?", user1.Name).Asc("id").Get(&user1)fmt.Println(user1)//获取指定字段的值var name stringengine.Table(&user).Where("id=1").Cols("name").Get(&name)fmt.Println(name)//Find查询多条记录var users []Userengine.Where("passwd='wwwwwwww'").Limit(10, 0).Find(&users)fmt.Println(users)//根据条件查询总条数userCount := User{}total, err := engine.Count(&userCount)fmt.Println(total)//Iterate 和 Rows 根据条件遍历数据engine.Iterate(&userCount, func(idx int, bean interface{}) error {user := bean.(*User)fmt.Println(user)return nil})rows, err := engine.Rows(&user)defer rows.Close()for rows.Next() {rows.Scan(user)fmt.Println(user)}
}
事务
package mainimport ("fmt"_ "github.com/go-sql-driver/mysql""time""xorm.io/xorm"
)func main() {//初始化数据库连接信息var (userName = "root"passWord = "xxxxxx"ipAddress = "127.0.0.1"port = 3306dbName = "poem_noun"charset = "utf8mb4")dataSourceName := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s", userName, passWord, ipAddress, port, dbName, charset)//创建引擎,driverName, dataSourceName 和 database/sql 接口相同engine, err := xorm.NewEngine("mysql", dataSourceName)if err != nil {fmt.Println("数据库连接失败")}type User struct {Id int64Name stringAge intPasswd string `xorm:"varchar(200)"`Created time.Time `xorm:"created"`Updated time.Time `xorm:"updated"`}//创建事务并开启session := engine.NewSession()defer session.Close()session.Begin()defer func() {err := recover()if err != nil {session.Rollback()} else {session.Commit()}}()user := User{Id: 3, Name: "RRRR", Age: 20, Passwd: "54644"}if _, err := session.Insert(&user); err != nil {panic(err)}
}
具体官方文档地址:https://gitea.com/xorm/xorm/src/branch/master/README_CN.md