Lunny Xiao a8717e5e3a Use AfterLoad instead of AfterSet on Structs ()
* use AfterLoad instead of AfterSet on Structs

* fix the comments on AfterLoad

* fix the comments on action AfterLoad
..
CONTRIBUTING.md Added all required dependencies
LICENSE Added all required dependencies
README.md Use created & updated instead BeforeInsert & BeforeUpdate ()
README_CN.md update latest xorm version to vendor ()
cache_lru.go Use created & updated instead BeforeInsert & BeforeUpdate ()
cache_memory_store.go update latest xorm version to vendor ()
circle.yml Use created & updated instead BeforeInsert & BeforeUpdate ()
convert.go Use created & updated instead BeforeInsert & BeforeUpdate ()
dialect_mssql.go update latest xorm version to vendor ()
dialect_mysql.go update latest xorm version to vendor ()
dialect_oracle.go fix migrate failed and org dashboard failed on MSSQL database ()
dialect_postgres.go Use created & updated instead BeforeInsert & BeforeUpdate ()
dialect_sqlite3.go update latest xorm version to vendor ()
doc.go Use created & updated instead BeforeInsert & BeforeUpdate ()
engine.go Use AfterLoad instead of AfterSet on Structs ()
engine_cond.go update latest xorm version to vendor ()
engine_maxlife.go update latest xorm version to vendor ()
error.go Update xorm and dependencies vendor for feature to dump to other database ()
gen_reserved.sh Added all required dependencies
helpers.go Use AfterLoad instead of AfterSet on Structs ()
helpler_time.go update latest xorm version to vendor ()
logger.go Update xorm and fix dump command ()
pg_reserved.txt Added all required dependencies
processors.go Use AfterLoad instead of AfterSet on Structs ()
rows.go Use AfterLoad instead of AfterSet on Structs ()
session.go Use AfterLoad instead of AfterSet on Structs ()
session_cols.go update latest xorm version to vendor ()
session_cond.go update latest xorm version to vendor ()
session_convert.go Use created & updated instead BeforeInsert & BeforeUpdate ()
session_delete.go Use AfterLoad instead of AfterSet on Structs ()
session_exist.go Use created & updated instead BeforeInsert & BeforeUpdate ()
session_find.go Use AfterLoad instead of AfterSet on Structs ()
session_get.go Use AfterLoad instead of AfterSet on Structs ()
session_insert.go Use AfterLoad instead of AfterSet on Structs ()
session_iterate.go Use AfterLoad instead of AfterSet on Structs ()
session_query.go Use created & updated instead BeforeInsert & BeforeUpdate ()
session_raw.go Use created & updated instead BeforeInsert & BeforeUpdate ()
session_schema.go Use created & updated instead BeforeInsert & BeforeUpdate ()
session_stats.go Use created & updated instead BeforeInsert & BeforeUpdate ()
session_tx.go update latest xorm version to vendor ()
session_update.go Use AfterLoad instead of AfterSet on Structs ()
statement.go Use AfterLoad instead of AfterSet on Structs ()
syslogger.go Update xorm and dependencies vendor for feature to dump to other database ()
tag.go update latest xorm version to vendor ()
test_mssql.sh update latest xorm version to vendor ()
test_mssql_cache.sh Use created & updated instead BeforeInsert & BeforeUpdate ()
test_mymysql.sh update latest xorm version to vendor ()
test_mymysql_cache.sh Use created & updated instead BeforeInsert & BeforeUpdate ()
test_mysql.sh update latest xorm version to vendor ()
test_mysql_cache.sh Use created & updated instead BeforeInsert & BeforeUpdate ()
test_postgres.sh update latest xorm version to vendor ()
test_postgres_cache.sh Use created & updated instead BeforeInsert & BeforeUpdate ()
test_sqlite.sh update latest xorm version to vendor ()
test_sqlite_cache.sh Use created & updated instead BeforeInsert & BeforeUpdate ()
types.go Update xorm and fix dump command ()
xorm.go Use created & updated instead BeforeInsert & BeforeUpdate ()

README.md

中文

Xorm is a simple and powerful ORM for Go.

CircleCI codecov Join the chat at https://img.shields.io/discord/323460943201959939.svg

Features

  • Struct <-> Table Mapping Support

  • Chainable APIs

  • Transaction Support

  • Both ORM and raw SQL operation Support

  • Sync database schema Support

  • Query Cache speed up

  • Database Reverse support, See Xorm Tool README

  • Simple cascade loading support

  • Optimistic Locking support

  • SQL Builder support via github.com/go-xorm/builder

Drivers Support

Drivers for Go's sql package which currently support database/sql includes:

Changelog

  • v0.6.3

    • merge tests to main project
    • add Exist function
    • add SumInt function
    • Mysql now support read and create column comment.
    • fix time related bugs.
    • fix some other bugs.
  • v0.6.2

    • refactor tag parse methods
    • add Scan features to Get
    • add QueryString method
  • v0.6.0

    • remove support for ql
    • add query condition builder support via github.com/go-xorm/builder, so Where, And, Or methods can use builder.Cond as parameter
    • add Sum, SumInt, SumInt64 and NotIn methods
    • some bugs fixed

More changes ...

Installation

go get github.com/go-xorm/xorm

Documents

Quick Start

  • Create Engine
engine, err := xorm.NewEngine(driverName, dataSourceName)
  • Define a struct and Sync2 table struct to database
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))
  • Query runs a SQL string, the returned results is []map[string][]byte, QueryString returns []map[string]string.
results, err := engine.Query("select * from user")

results, err := engine.QueryString("select * from user")
  • Execute runs a SQL string, it returns affected and error
affected, err := engine.Exec("update user set age = ? where name = ?", age, name)
  • Insert one or multiple records to database
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 (),(),()
  • Query one record from database
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
var name string
has, err := engine.Where("id = ?", id).Cols("name").Get(&name)
// SELECT name FROM user WHERE id = ?
var id int64
has, err := engine.Where("name = ?", name).Cols("id").Get(&id)
// SELECT id FROM user WHERE name = ?
var valuesMap = make(map[string]string)
has, err := engine.Where("id = ?", id).Get(&valuesMap)
// SELECT * FROM user WHERE id = ?
var valuesSlice = make([]interface{}, len(cols))
has, err := engine.Where("id = ?", id).Cols(cols...).Get(&valuesSlice)
// SELECT col1, col2, col3 FROM user WHERE id = ?
  • Check if one record exist on table
has, err := testEngine.Exist(new(RecordExist))
// SELECT * FROM record_exist LIMIT 1
has, err = testEngine.Exist(&RecordExist{
		Name: "test1",
	})
// SELECT * FROM record_exist WHERE name = ? LIMIT 1
has, err = testEngine.Where("name = ?", "test1").Exist(&RecordExist{})
// SELECT * FROM record_exist WHERE name = ? LIMIT 1
has, err = testEngine.SQL("select * from record_exist where name = ?", "test1").Exist()
// select * from record_exist where name = ?
has, err = testEngine.Table("record_exist").Exist()
// SELECT * FROM record_exist LIMIT 1
has, err = testEngine.Table("record_exist").Where("name = ?", "test1").Exist()
// SELECT * FROM record_exist WHERE name = ? LIMIT 1
  • Query multiple records from database, also you can use join and extends
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
  • Query multiple records and record by record handle, there are two methods Iterate and Rows
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)
}
  • Update one or more records, default will update non-empty and non-zero fields except when you use Cols, AllCols and so on.
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("id", 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 = ?
  • Delete one or more records, Delete MUST have condition
affected, err := engine.Where(...).Delete(&user)
// DELETE FROM user Where ...
affected, err := engine.Id(2).Delete(&user)
  • Count records
counts, err := engine.Count(&user)
// SELECT count(*) AS total FROM user
  • Query conditions builder
err := engine.Where(builder.NotIn("a", 1, 2).And(builder.In("b", "c", "d", "e"))).Find(&users)
// SELECT id, name ... FROM user WHERE a NOT IN (?, ?) AND b IN (?, ?, ?)

Cases

Discuss

Please visit Xorm on Google Groups

Contributing

If you want to pull request, please see CONTRIBUTING

LICENSE

BSD License http://creativecommons.org/licenses/BSD/