Categorygithub.com/chronokeeper/xorm
modulepackage
0.6.3
Repository: https://github.com/chronokeeper/xorm.git
Documentation: pkg.go.dev

# README

中文

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/

# Packages

No description provided by the author
No description provided by the author

# Functions

AutoIncrTagHandler describes autoincr tag handler.
CacheTagHandler describes cache tag handler.
CommentTagHandler add comment to column.
CreatedTagHandler describes created tag handler.
DefaultTagHandler describes default tag handler.
DeletedTagHandler describes deleted tag handler.
ExtendsTagHandler describes extends tag handler.
IgnoreTagHandler describes ignored tag handler.
IndexTagHandler describes index tag handler.
LocalTagHandler describes local tag handler.
NewEngine new a db manager according to the parameter.
NewLRUCacher creates a cacher.
NewLRUCacher2 creates a cache include different params.
NewMemoryStore creates a new store in memory.
NewSimpleLogger use a special io.Writer as logger output.
NewSimpleLogger2 let you customrize your logger prefix and flag.
NewSimpleLogger3 let you customrize your logger prefix and flag and logLevel.
NewSyslogLogger implements core.ILogger.
NoCacheTagHandler describes nocache tag handler.
NotNullTagHandler describes notnull tag handler.
NULLTagHandler describes null tag handler.
OnlyFromDBTagHandler describes mapping direction tag handler.
OnlyToDBTagHandler describes mapping direction tag handler.
PKTagHandler decribes primary key tag handler.
SQLTypeTagHandler describes SQL Type tag handler.
UniqueTagHandler describes unique tag handler.
UpdatedTagHandler describes updated tag handler.
UTCTagHandler describes utc tag handler.
VersionTagHandler describes version tag handler.

# Constants

default log options.
default log options.
default log options.
Version show the xorm's version.

# Variables

ErrCacheFailed cache failed error.
ErrNeedDeletedCond delete needs less one condition error.
ErrNotExist record is not exist error.
ErrNotImplemented not implemented.
ErrParamsType params error.
ErrTableNotFound table not found error.
ErrUnSupportedType unsupported error.

# Structs

DiscardLogger don't log implementation for core.ILogger.
Engine is the major struct of xorm, it means a database manager.
LRUCacher implments cache object facilities.
MemoryStore represents in-memory store.
Rows rows wrapper a rows to.
Session keep a pointer to sql.DB and provides all execution of all kind of database operations.
SimpleLogger is the default implment of core.ILogger.
Statement save all the sql info for executing SQL.
SyslogLogger will be depricated.
Table table struct.

# Interfaces

AfterDeleteProcessor executed after an object has been deleted.
AfterInsertProcessor executed after an object is persisted to the database.
AfterSetProcessor executed after data set to the struct fields.
AfterUpdateProcessor executed after an object has been updated.
BeforeDeleteProcessor executed before an object is deleted.
BeforeInsertProcessor executed before an object is initially persisted to the database.
BeforeSetProcessor executed before data set to the struct fields.
BeforeUpdateProcessor executed before an object is updated.
TableName table name interface to define customerize table name.

# Type aliases

IterFunc only use by Iterate.