orm

package
v1.3.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 19, 2014 License: Apache-2.0 Imports: 12 Imported by: 0

README

beego orm

Build Status

A powerful orm framework for go.

It is heavily influenced by Django ORM, SQLAlchemy.

now, beta, unstable, may be changing some api make your app build failed.

Support Database:

Passed all test, but need more feedback.

Features:

  • full go type support
  • easy for usage, simple CRUD operation
  • auto join with relation table
  • cross DataBase compatible query
  • Raw SQL query / mapper without orm model
  • full test keep stable and strong

more features please read the docs

Install:

go get github.com/astaxie/beego/orm

Changelog

  • 2013-08-19: support table auto create
  • 2013-08-13: update test for database types
  • 2013-08-13: go type support, such as int8, uint8, byte, rune
  • 2013-08-13: date / datetime timezone support very well

Quick Start

Simple Usage
package main

import (
	"fmt"
	"github.com/astaxie/beego/orm"
	_ "github.com/go-sql-driver/mysql" // import your used driver
)

// Model Struct
type User struct {
	Id   int    `orm:"auto"`
	Name string `orm:"size(100)"`
}

func init() {
	// register model
	orm.RegisterModel(new(User))

	// set default database
	orm.RegisterDataBase("default", "mysql", "root:root@/my_db?charset=utf8", 30)
}

func main() {
	o := orm.NewOrm()

	user := User{Name: "slene"}

	// insert
	id, err := o.Insert(&user)

	// update
	user.Name = "astaxie"
	num, err := o.Update(&user)

	// read one
	u := User{Id: user.Id}
	err = o.Read(&u)

	// delete
	num, err = o.Delete(&u)	
}
Next with relation
type Post struct {
	Id    int    `orm:"auto"`
	Title string `orm:"size(100)"`
	User  *User  `orm:"rel(fk)"`
}

var posts []*Post
qs := o.QueryTable("post")
num, err := qs.Filter("User__Name", "slene").All(&posts)
Use Raw sql

If you don't like ORM,use Raw SQL to query / mapping without ORM setting

var maps []Params
num, err := o.Raw("SELECT id FROM user WHERE name = ?", "slene").Values(&maps)
if num > 0 {
	fmt.Println(maps[0]["id"])
}
Transaction
o.Begin()
...
user := User{Name: "slene"}
id, err := o.Insert(&user)
if err != nil {
	o.Commit()
} else {
	o.Rollback()
}

Debug Log Queries

In development env, you can simple use

func main() {
	orm.Debug = true
...

enable log queries.

output include all queries, such as exec / prepare / transaction.

like this:

[ORM] - 2013-08-09 13:18:16 - [Queries/default] - [    db.Exec /     0.4ms] - [INSERT INTO `user` (`name`) VALUES (?)] - `slene`
...

note: not recommend use this in product env.

Docs

more details and examples in docs and test

TODO

  • some unrealized api
  • examples
  • docs

Documentation

Index

Constants

View Source
const (
	// bool
	TypeBooleanField = 1 << iota

	// string
	TypeCharField

	// string
	TypeTextField

	// time.Time
	TypeDateField
	// time.Time
	TypeDateTimeField

	// int8
	TypeBitField
	// int16
	TypeSmallIntegerField
	// int32
	TypeIntegerField
	// int64
	TypeBigIntegerField
	// uint8
	TypePositiveBitField
	// uint16
	TypePositiveSmallIntegerField
	// uint32
	TypePositiveIntegerField
	// uint64
	TypePositiveBigIntegerField

	// float64
	TypeFloatField
	// float64
	TypeDecimalField

	RelForeignKey
	RelOneToOne
	RelManyToMany
	RelReverseOne
	RelReverseMany
)
View Source
const (
	IsIntegerField        = ^-TypePositiveBigIntegerField >> 4 << 5
	IsPostiveIntegerField = ^-TypePositiveBigIntegerField >> 8 << 9
	IsRelField            = ^-RelReverseMany >> 14 << 15
	IsFieldType           = ^-RelReverseMany<<1 + 1
)
View Source
const (
	Col_Add operator = iota
	Col_Minus
	Col_Multiply
	Col_Except
)
View Source
const (
	Debug_Queries = iota
)
View Source
const (
	ExprSep = "__"
)

Variables

View Source
var (
	// DebugLevel       = Debug_Queries
	Debug            = false
	DebugLog         = NewLog(os.Stderr)
	DefaultRowsLimit = 1000
	DefaultRelsDepth = 2
	DefaultTimeLoc   = time.Local
	ErrTxHasBegan    = errors.New("<Ormer.Begin> transaction already begin")
	ErrTxDone        = errors.New("<Ormer.Commit/Rollback> transaction not begin")
	ErrMultiRows     = errors.New("<QuerySeter> return multi rows")
	ErrNoRows        = errors.New("<QuerySeter> no row found")
	ErrStmtClosed    = errors.New("<QuerySeter> stmt already closed")
	ErrArgs          = errors.New("<Ormer> args error may be empty")
	ErrNotImplement  = errors.New("have not implement")
)
View Source
var (
	ErrMissPK = errors.New("missed pk value") // missing pk error
)

Functions

func AddAliasWthDB

func AddAliasWthDB(aliasName, driverName string, db *sql.DB) error

func BootStrap

func BootStrap()

bootrap models. make all model parsed and can not add more models

func ColValue

func ColValue(opt operator, value interface{}) interface{}

ColValue do the field raw changes. e.g Nums = Nums + 10. usage:

Params{
	"Nums": ColValue(Col_Add, 10),
}

func GetDB

func GetDB(aliasNames ...string) (*sql.DB, error)

Get *sql.DB from registered database by db alias name. Use "default" as alias name if you not set.

func RegisterDataBase

func RegisterDataBase(aliasName, driverName, dataSource string, params ...int) error

Setting the database connect params. Use the database driver self dataSource args.

func RegisterDriver

func RegisterDriver(driverName string, typ DriverType) error

Register a database driver use specify driver name, this can be definition the driver is which database type.

func RegisterModel

func RegisterModel(models ...interface{})

register models

func RegisterModelWithPrefix

func RegisterModelWithPrefix(prefix string, models ...interface{})

register models with a prefix

func ResetModelCache

func ResetModelCache()

Clean model cache. Then you can re-RegisterModel. Common use this api for test case.

func RunCommand

func RunCommand()

listen for orm command and then run it if command arguments passed.

func RunSyncdb

func RunSyncdb(name string, force bool, verbose bool) error

run syncdb command line. name means table's alias name. default is "default". force means run next sql if the current is error. verbose means show all info when running command or not.

func SetDataBaseTZ

func SetDataBaseTZ(aliasName string, tz *time.Location) error

Change the database default used timezone

func SetMaxIdleConns

func SetMaxIdleConns(aliasName string, maxIdleConns int)

Change the max idle conns for *sql.DB, use specify database alias name

func SetMaxOpenConns

func SetMaxOpenConns(aliasName string, maxOpenConns int)

Change the max open conns for *sql.DB, use specify database alias name

func ToInt64

func ToInt64(value interface{}) (d int64)

interface to int64

func ToStr

func ToStr(value interface{}, args ...int) (s string)

interface to string

Types

type BigIntegerField

type BigIntegerField int64

-9223372036854775808 to 9223372036854775807.

func (*BigIntegerField) FieldType

func (e *BigIntegerField) FieldType() int

func (*BigIntegerField) RawValue

func (e *BigIntegerField) RawValue() interface{}

func (*BigIntegerField) Set

func (e *BigIntegerField) Set(d int64)

func (*BigIntegerField) SetRaw

func (e *BigIntegerField) SetRaw(value interface{}) error

func (*BigIntegerField) String

func (e *BigIntegerField) String() string

func (BigIntegerField) Value

func (e BigIntegerField) Value() int64

type BooleanField

type BooleanField bool

A true/false field.

func (*BooleanField) FieldType

func (e *BooleanField) FieldType() int

func (*BooleanField) RawValue

func (e *BooleanField) RawValue() interface{}

func (*BooleanField) Set

func (e *BooleanField) Set(d bool)

func (*BooleanField) SetRaw

func (e *BooleanField) SetRaw(value interface{}) error

func (*BooleanField) String

func (e *BooleanField) String() string

func (BooleanField) Value

func (e BooleanField) Value() bool

type CharField

type CharField string

A string field required values tag: size The size is enforced at the database level and in models’s validation. eg: `orm:"size(120)"`

func (*CharField) FieldType

func (e *CharField) FieldType() int

func (*CharField) RawValue

func (e *CharField) RawValue() interface{}

func (*CharField) Set

func (e *CharField) Set(d string)

func (*CharField) SetRaw

func (e *CharField) SetRaw(value interface{}) error

func (*CharField) String

func (e *CharField) String() string

func (CharField) Value

func (e CharField) Value() string

type Condition

type Condition struct {
	// contains filtered or unexported fields
}

condition struct. work for WHERE conditions.

func NewCondition

func NewCondition() *Condition

return new condition struct

func (Condition) And

func (c Condition) And(expr string, args ...interface{}) *Condition

add expression to condition

func (*Condition) AndCond

func (c *Condition) AndCond(cond *Condition) *Condition

combine a condition to current condition

func (Condition) AndNot

func (c Condition) AndNot(expr string, args ...interface{}) *Condition

add NOT expression to condition

func (*Condition) IsEmpty

func (c *Condition) IsEmpty() bool

check the condition arguments are empty or not.

func (Condition) Or

func (c Condition) Or(expr string, args ...interface{}) *Condition

add OR expression to condition

func (*Condition) OrCond

func (c *Condition) OrCond(cond *Condition) *Condition

combine a OR condition to current condition

func (Condition) OrNot

func (c Condition) OrNot(expr string, args ...interface{}) *Condition

add OR NOT expression to condition

type DateField

type DateField time.Time

A date, represented in go by a time.Time instance. only date values like 2006-01-02 Has a few extra, optional attr tag:

auto_now: Automatically set the field to now every time the object is saved. Useful for “last-modified” timestamps. Note that the current date is always used; it’s not just a default value that you can override.

auto_now_add: Automatically set the field to now when the object is first created. Useful for creation of timestamps. Note that the current date is always used; it’s not just a default value that you can override.

eg: `orm:"auto_now"` or `orm:"auto_now_add"`

func (*DateField) FieldType

func (e *DateField) FieldType() int

func (*DateField) RawValue

func (e *DateField) RawValue() interface{}

func (*DateField) Set

func (e *DateField) Set(d time.Time)

func (*DateField) SetRaw

func (e *DateField) SetRaw(value interface{}) error

func (*DateField) String

func (e *DateField) String() string

func (DateField) Value

func (e DateField) Value() time.Time

type DateTimeField

type DateTimeField time.Time

A date, represented in go by a time.Time instance. datetime values like 2006-01-02 15:04:05 Takes the same extra arguments as DateField.

func (*DateTimeField) FieldType

func (e *DateTimeField) FieldType() int

func (*DateTimeField) RawValue

func (e *DateTimeField) RawValue() interface{}

func (*DateTimeField) Set

func (e *DateTimeField) Set(d time.Time)

func (*DateTimeField) SetRaw

func (e *DateTimeField) SetRaw(value interface{}) error

func (*DateTimeField) String

func (e *DateTimeField) String() string

func (DateTimeField) Value

func (e DateTimeField) Value() time.Time

type Driver

type Driver interface {
	Name() string
	Type() DriverType
}

database driver

type DriverType

type DriverType int

database driver constant int.

const (
	DR_MySQL    DriverType // mysql
	DR_Sqlite              // sqlite
	DR_Oracle              // oracle
	DR_Postgres            // pgsql
)

type Fielder

type Fielder interface {
	String() string
	FieldType() int
	SetRaw(interface{}) error
	RawValue() interface{}
}

field info

type FloatField

type FloatField float64

A floating-point number represented in go by a float32 value.

func (*FloatField) FieldType

func (e *FloatField) FieldType() int

func (*FloatField) RawValue

func (e *FloatField) RawValue() interface{}

func (*FloatField) Set

func (e *FloatField) Set(d float64)

func (*FloatField) SetRaw

func (e *FloatField) SetRaw(value interface{}) error

func (*FloatField) String

func (e *FloatField) String() string

func (FloatField) Value

func (e FloatField) Value() float64

type Inserter

type Inserter interface {
	Insert(interface{}) (int64, error)
	Close() error
}

insert prepared statement

type IntegerField

type IntegerField int32

-2147483648 to 2147483647

func (*IntegerField) FieldType

func (e *IntegerField) FieldType() int

func (*IntegerField) RawValue

func (e *IntegerField) RawValue() interface{}

func (*IntegerField) Set

func (e *IntegerField) Set(d int32)

func (*IntegerField) SetRaw

func (e *IntegerField) SetRaw(value interface{}) error

func (*IntegerField) String

func (e *IntegerField) String() string

func (IntegerField) Value

func (e IntegerField) Value() int32

type Log

type Log struct {
	*log.Logger
}

func NewLog

func NewLog(out io.Writer) *Log

set io.Writer to create a Logger.

type Ormer

type Ormer interface {
	Read(interface{}, ...string) error
	ReadOrCreate(interface{}, string, ...string) (bool, int64, error)
	Insert(interface{}) (int64, error)
	InsertMulti(int, interface{}) (int64, error)
	Update(interface{}, ...string) (int64, error)
	Delete(interface{}) (int64, error)
	LoadRelated(interface{}, string, ...interface{}) (int64, error)
	QueryM2M(interface{}, string) QueryM2Mer
	QueryTable(interface{}) QuerySeter
	Using(string) error
	Begin() error
	Commit() error
	Rollback() error
	Raw(string, ...interface{}) RawSeter
	Driver() Driver
	GetDB() dbQuerier
}

orm struct

func NewOrm

func NewOrm() Ormer

create new orm

func NewOrmWithDB

func NewOrmWithDB(driverName, aliasName string, db *sql.DB) (Ormer, error)

create a new ormer object with specify *sql.DB for query

type Params

type Params map[string]interface{}

type ParamsList

type ParamsList []interface{}

type PositiveBigIntegerField

type PositiveBigIntegerField uint64

0 to 18446744073709551615

func (*PositiveBigIntegerField) FieldType

func (e *PositiveBigIntegerField) FieldType() int

func (*PositiveBigIntegerField) RawValue

func (e *PositiveBigIntegerField) RawValue() interface{}

func (*PositiveBigIntegerField) Set

func (e *PositiveBigIntegerField) Set(d uint64)

func (*PositiveBigIntegerField) SetRaw

func (e *PositiveBigIntegerField) SetRaw(value interface{}) error

func (*PositiveBigIntegerField) String

func (e *PositiveBigIntegerField) String() string

func (PositiveBigIntegerField) Value

func (e PositiveBigIntegerField) Value() uint64

type PositiveIntegerField

type PositiveIntegerField uint32

0 to 4294967295

func (*PositiveIntegerField) FieldType

func (e *PositiveIntegerField) FieldType() int

func (*PositiveIntegerField) RawValue

func (e *PositiveIntegerField) RawValue() interface{}

func (*PositiveIntegerField) Set

func (e *PositiveIntegerField) Set(d uint32)

func (*PositiveIntegerField) SetRaw

func (e *PositiveIntegerField) SetRaw(value interface{}) error

func (*PositiveIntegerField) String

func (e *PositiveIntegerField) String() string

func (PositiveIntegerField) Value

func (e PositiveIntegerField) Value() uint32

type PositiveSmallIntegerField

type PositiveSmallIntegerField uint16

0 to 65535

func (*PositiveSmallIntegerField) FieldType

func (e *PositiveSmallIntegerField) FieldType() int

func (*PositiveSmallIntegerField) RawValue

func (e *PositiveSmallIntegerField) RawValue() interface{}

func (*PositiveSmallIntegerField) Set

func (*PositiveSmallIntegerField) SetRaw

func (e *PositiveSmallIntegerField) SetRaw(value interface{}) error

func (*PositiveSmallIntegerField) String

func (e *PositiveSmallIntegerField) String() string

func (PositiveSmallIntegerField) Value

type QueryM2Mer

type QueryM2Mer interface {
	Add(...interface{}) (int64, error)
	Remove(...interface{}) (int64, error)
	Exist(interface{}) bool
	Clear() (int64, error)
	Count() (int64, error)
}

model to model query struct

type QuerySeter

type QuerySeter interface {
	Filter(string, ...interface{}) QuerySeter
	Exclude(string, ...interface{}) QuerySeter
	SetCond(*Condition) QuerySeter
	Limit(interface{}, ...interface{}) QuerySeter
	Offset(interface{}) QuerySeter
	OrderBy(...string) QuerySeter
	RelatedSel(...interface{}) QuerySeter
	Count() (int64, error)
	Exist() bool
	Update(Params) (int64, error)
	Delete() (int64, error)
	PrepareInsert() (Inserter, error)
	All(interface{}, ...string) (int64, error)
	One(interface{}, ...string) error
	Values(*[]Params, ...string) (int64, error)
	ValuesList(*[]ParamsList, ...string) (int64, error)
	ValuesFlat(*ParamsList, string) (int64, error)
	RowsToMap(*Params, string, string) (int64, error)
	RowsToStruct(interface{}, string, string) (int64, error)
}

query seter

type RawPreparer

type RawPreparer interface {
	Exec(...interface{}) (sql.Result, error)
	Close() error
}

raw query statement

type RawSeter

type RawSeter interface {
	Exec() (sql.Result, error)
	QueryRow(...interface{}) error
	QueryRows(...interface{}) (int64, error)
	SetArgs(...interface{}) RawSeter
	Values(*[]Params, ...string) (int64, error)
	ValuesList(*[]ParamsList, ...string) (int64, error)
	ValuesFlat(*ParamsList, ...string) (int64, error)
	RowsToMap(*Params, string, string) (int64, error)
	RowsToStruct(interface{}, string, string) (int64, error)
	Prepare() (RawPreparer, error)
}

raw query seter

type SmallIntegerField

type SmallIntegerField int16

-32768 to 32767

func (*SmallIntegerField) FieldType

func (e *SmallIntegerField) FieldType() int

func (*SmallIntegerField) RawValue

func (e *SmallIntegerField) RawValue() interface{}

func (*SmallIntegerField) Set

func (e *SmallIntegerField) Set(d int16)

func (*SmallIntegerField) SetRaw

func (e *SmallIntegerField) SetRaw(value interface{}) error

func (*SmallIntegerField) String

func (e *SmallIntegerField) String() string

func (SmallIntegerField) Value

func (e SmallIntegerField) Value() int16

type StrTo

type StrTo string

func (StrTo) Bool

func (f StrTo) Bool() (bool, error)

string to bool

func (*StrTo) Clear

func (f *StrTo) Clear()

clean string

func (StrTo) Exist

func (f StrTo) Exist() bool

check string exist

func (StrTo) Float32

func (f StrTo) Float32() (float32, error)

string to float32

func (StrTo) Float64

func (f StrTo) Float64() (float64, error)

string to float64

func (StrTo) Int

func (f StrTo) Int() (int, error)

string to int

func (StrTo) Int16

func (f StrTo) Int16() (int16, error)

string to int16

func (StrTo) Int32

func (f StrTo) Int32() (int32, error)

string to int32

func (StrTo) Int64

func (f StrTo) Int64() (int64, error)

string to int64

func (StrTo) Int8

func (f StrTo) Int8() (int8, error)

string to int8

func (*StrTo) Set

func (f *StrTo) Set(v string)

set string

func (StrTo) String

func (f StrTo) String() string

string to string

func (StrTo) Uint

func (f StrTo) Uint() (uint, error)

string to uint

func (StrTo) Uint16

func (f StrTo) Uint16() (uint16, error)

string to uint16

func (StrTo) Uint32

func (f StrTo) Uint32() (uint32, error)

string to uint31

func (StrTo) Uint64

func (f StrTo) Uint64() (uint64, error)

string to uint64

func (StrTo) Uint8

func (f StrTo) Uint8() (uint8, error)

string to uint8

type TextField

type TextField string

A large text field.

func (*TextField) FieldType

func (e *TextField) FieldType() int

func (*TextField) RawValue

func (e *TextField) RawValue() interface{}

func (*TextField) Set

func (e *TextField) Set(d string)

func (*TextField) SetRaw

func (e *TextField) SetRaw(value interface{}) error

func (*TextField) String

func (e *TextField) String() string

func (TextField) Value

func (e TextField) Value() string

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL