All Projects → RevenueMonster → Goloquent

RevenueMonster / Goloquent

Licence: mit
This repo no longer under maintenance, please go to https://github.com/si3nloong/sqlike

Programming Languages

go
31211 projects - #10 most used programming language
golang
3204 projects

Projects that are alternatives of or similar to Goloquent

Wp Eloquent
Eloquent ORM for WordPress
Stars: ✭ 478 (+2887.5%)
Mutual labels:  orm, eloquent, database, mysql
Crecto
Database wrapper and ORM for Crystal, inspired by Ecto
Stars: ✭ 325 (+1931.25%)
Mutual labels:  orm, database, mysql
Rel
💎 Modern Database Access Layer for Golang - Testable, Extendable and Crafted Into a Clean and Elegant API
Stars: ✭ 317 (+1881.25%)
Mutual labels:  orm, database, mysql
Jooq
jOOQ is the best way to write SQL in Java
Stars: ✭ 4,695 (+29243.75%)
Mutual labels:  orm, database, mysql
Sequelizer
A GUI Desktop App for export sequelize models from database automatically.
Stars: ✭ 273 (+1606.25%)
Mutual labels:  orm, database, mysql
Node Orm2
Object Relational Mapping
Stars: ✭ 3,063 (+19043.75%)
Mutual labels:  orm, database, mysql
Gnorm
A database-first code generator for any language
Stars: ✭ 415 (+2493.75%)
Mutual labels:  orm, database, mysql
Db
Data access layer for PostgreSQL, CockroachDB, MySQL, SQLite and MongoDB with ORM-like features.
Stars: ✭ 2,832 (+17600%)
Mutual labels:  orm, database, mysql
Maghead
The fastest pure PHP database framework with a powerful static code generator, supports horizontal scale up, designed for PHP7
Stars: ✭ 483 (+2918.75%)
Mutual labels:  orm, database, mysql
Bookshelf
A simple Node.js ORM for PostgreSQL, MySQL and SQLite3 built on top of Knex.js
Stars: ✭ 6,252 (+38975%)
Mutual labels:  orm, database, mysql
Denodb
MySQL, SQLite, MariaDB, PostgreSQL and MongoDB ORM for Deno
Stars: ✭ 498 (+3012.5%)
Mutual labels:  orm, database, mysql
Wetland
A Node.js ORM, mapping-based. Works with MySQL, PostgreSQL, SQLite and more.
Stars: ✭ 261 (+1531.25%)
Mutual labels:  orm, database, mysql
Mikro Orm
TypeScript ORM for Node.js based on Data Mapper, Unit of Work and Identity Map patterns. Supports MongoDB, MySQL, MariaDB, PostgreSQL and SQLite databases.
Stars: ✭ 3,874 (+24112.5%)
Mutual labels:  orm, database, mysql
Architect
A set of tools which enhances ORMs written in Python with more features
Stars: ✭ 320 (+1900%)
Mutual labels:  orm, database, mysql
Granite
ORM Model with Adapters for mysql, pg, sqlite in the Crystal Language.
Stars: ✭ 238 (+1387.5%)
Mutual labels:  orm, database, mysql
Sqlboiler
Generate a Go ORM tailored to your database schema.
Stars: ✭ 4,497 (+28006.25%)
Mutual labels:  orm, database, mysql
Nut
Advanced, Powerful and easy to use ORM for Qt
Stars: ✭ 181 (+1031.25%)
Mutual labels:  orm, database, mysql
Simple Crud
PHP library to provide magic CRUD in MySQL/Sqlite databases with zero configuration
Stars: ✭ 190 (+1087.5%)
Mutual labels:  orm, database, mysql
Go Sqlbuilder
A flexible and powerful SQL string builder library plus a zero-config ORM.
Stars: ✭ 539 (+3268.75%)
Mutual labels:  orm, database, mysql
Qb
The database toolkit for go
Stars: ✭ 524 (+3175%)
Mutual labels:  orm, database, mysql

MySQL Datastore ORM

Inspired by Laravel Eloquent and Google Cloud Datastore

This repo still under development. We accept any pull request. ^_^

Database Support

  • [x] MySQL
  • [ ] Datastore (Pending)

Installation

  // dependency
  $ go get -u github.com/go-sql-driver/mysql
  $ go get -u cloud.google.com/go/datastore

  $ go get -u github.com/RevenueMonster/goloquent
  • Import the library
  import "github.com/revenuemonster/goloquent"

Quick Start

Connect to database

    // Connect to mysql, please refer to https://github.com/go-sql-driver/mysql#dsn-data-source-name
    db, err := goloquent.Open("mysql", "username:[email protected]/dbname")
    if err != nil {
        panic("Connection error: ", err)
    }

User Table

// User : User kind parent is Merchant
type User struct {
    Key             *datastore.Key `goloquent:"__key__"` // load table key
    Name            string
    CountryCode     string
    PhoneNumber     string
    Age             int64          `goloquent:",unsigned"`
    CreatedDateTime time.Time
    UpdatedDateTime time.Time
}

// LoadKey : populate property after Load
func (x *User) LoadKey(k *datastore.Key) error {
	x.Key = k
	return nil
}

// Load : load property
func (x *User) Load(ps []datastore.Property) error {
	return datastore.LoadStruct(x, ps)
}

// Save : manipulate property
func (x *User) Save() ([]datastore.Property, error) {
	return datastore.SaveStruct(x)
}

Helper

    goloquent.SetDebug(true) // Enable debug mode in goloquent

    // StringPrimaryKey is to get key value in string form
    key := datastore.NameKey("User", "mjfFgYnxBS", nil)
    fmt.Println(goloquent.StringPrimaryKey(key)) // "mjfFgYnxBS"

    key = datastore.IDKey("User", int64(2305297334603281546), nil)
    fmt.Println(goloquent.StringPrimaryKey(key)) // "2305297334603281546"

Create Record

    // Example
    user := new(User)
    user.Name = "Hello World"
    user.Age = 18

    // OR
    var user *User
    user.Name = "Hello World"
    user.Age = 18

    // Create without parent key
    if err := db.Table("User").Create(user, nil); err != nil {
        log.Println(err) // fail to create record
    }

    // Create with parent key
    parentKey := datastore.NameKey("Parent", "value", nil)
    if err := db.Table("User").Create(user, parentKey); err != nil {
        log.Println(err) // fail to create record
    }

    // Create with self generate key
    key := datastore.NameKey("User", "uniqueID", nil)
    if err := db.Table("User").Create(user, key); err != nil {
        log.Println(err) // fail to create record
    }

Upsert Record

    // Example
    user := new(User)
    user.Name = "Hello World"
    user.Age = 18

    // Update if key exists, else create the user record
    parentKey := datastore.NameKey("Parent", "value", nil)
    if err := db.Table("User").Upsert(user, parentKey); err != nil {
        log.Println(err) // fail
    }

    // Upsert with self generate key
    key := datastore.NameKey("User", "uniqueID", nil)
    if err := db.Table("User").Upsert(user, key); err != nil {
        log.Println(err) // fail
    }

Retrieve Record

  • Get Single Record using Primary Key
    // Example
    primaryKey := datastore.IDKey("User", int64(2305297334603281546), nil)
    user := new(User)
    if err := db.Table("User").Find(primaryKey, user); err != nil {
        log.Println(err) // error while retrieving record
    }

    if err := db.Table("User").
        Where("Status", "=", "ACTIVE").
        Find(primaryKey, user); err != goloquent.ErrNoSuchEntity {
        // if no record found using primary key, error `ErrNoSuchEntity` will throw instead
        log.Println(err) // error while retrieving record
    }
  • Get Single Record
    // Example 1
    user := new(User)
    if err := db.Table("User").First(user); err != nil {
        log.Println(err) // error while retrieving record
    }

    if user.Key != nil { // if have record
        fmt.Println("Have record")
    } else { // no record
        fmt.Println("Doesnt't have record")
    }

    // Example 2
    user := new(User)
    if err := db.Table("User").
        Where("Email", "=", "[email protected]").
        First(user); err != nil {
        log.Println(err) // error while retrieving record
    }

    // Example 3
    parentKey := datastore.IDKey("Parent", 1093, nil)
    user := new(User)
    if err := db.Table("User").
        Ancestor(parentKey).
        Where("Age", "=", 22).
        Order("-CreatedDateTime").
        First(user); err != nil {
        log.Println(err) // error while retrieving record
    }
  • Get Multiple Record
    // Example 1
    users := new([]User)
    if err := db.Table("User").
        Limit(10).
        Get(users); err != nil {
        log.Println(err) // error while retrieving record
    }

    // Example 2
    users := new([]*User)
    if err := db.Table("User").
        Where("Name", "=", "Hello World").
        Get(users); err != nil {
        log.Println(err) // error while retrieving record
    }

    // Example 3
    users := new([]User)
    if err := db.Table("User").
        Ancestor(parentKey).
        Where("Name", "=", "myz").
        Where("Age", "=", 22).
        Get(users); err != nil {
        log.Println(err) // error while retrieving record
    }
  • Get Record with Ordering
    // Ascending order
    users := new([]*User)
    if err := db.Table("User").
        Order("CreatedDateTime").
        Get(users); err != nil {
        log.Println(err) // error while retrieving record
    }

    // Descending order
    if err := db.Table("User").
        Order("-CreatedDateTime").
        Get(users); err != nil {
        log.Println(err) // error while retrieving record
    }
  • Pagination Record
    p := goloquent.Pagination{
        Limit:  10,
        Cursor: "", // pass the cursor that generate by the query so that it will display the next record
    }

    // Example
    users := new([]*User)
    if err := db.Table("User").
        Ancestor(parentKey).
        Order("-CreatedDateTime").
        Paginate(&p, users); err != nil {
        log.Println(err) // error while retrieving record
    }

    // ***************** OR ********************
    p := &goloquent.Pagination{
        Limit:  10, // number of records in each page
        Cursor: "EhQKCE1lcmNoYW50EK3bueKni5eNIxIWCgxMb3lhbHR5UG9pbnQaBkZrUUc4eA", // pass the cursor to get next record set
    }

    users := new([]*User)
    if err := db.Table("User").
        Ancestor(parentKey).
        Order("-CreatedDateTime").
        Paginate(p, users); err != nil {
        log.Println(err) // error while retrieving record
    }
  • Count Record
    // Example
    n, err := db.Table("User").Count()
    if err != nil {
        log.Println(err) // error while count record
    }

    n, err := db.Table("User").Where("Age", ">", 10).Count()
    if err != nil {
        log.Println(err)
    }

Delete Record

  • Delete using Primary Key
    // Example
    if err := db.Table("User").Delete(user.Key); err != nil {
        log.Println(err) // fail to delete record
    }
  • Delete using Where statement
    // Delete user table record which account type not equal to "PREMIUM" or "MONTLY"
    if err := db.Table("User").
        Where("AccountType", "!=", []string{
            "PREMIUM", "MONTLY",
        }).
        Delete(); err != nil {
        log.Println(err) // fail to delete record
    }
  • Soft Delete
    type User struct {
        Key  *datastore.Key `datastore:"__key__"` // primary key
        Name string
        goloquent.SoftDelete // User struct will using SoftDelete when deleting  
    }

    user := new(User)
        if err := db.Table("User").First(user); err != nil {
        log.Println(err) // error while retrieving record or record not found
    }

    if err := db.Table("User").SoftDelete(user.Key); err != nil {
        log.Println(err) // fail to delete record
    }

Transaction

    // Example
    if err := db.RunInTransaction(func(txn *goloquent.Connection) error {
        user := new(User)

        if err := txn.Table("User").Create(user, nil); err != nil {
            return err // return any err to rollback the transaction
        }

        return nil // return nil to commit the transaction
    }); err != nil {
        log.Println(err)
    }

MySQL Exclusive

  • Database Migration
    // Example
    user := new(User)
    if err := db.Table("User").Migrate(user); err != nil {
        log.Println(err)
    }
  • Unique Index
    // Create unique Index
    if err := db.Table("User").
        UniqueIndex("CountryCode", "PhoneNumber"); err != nil {
        log.Println(err)
    }

    // Drop Unique Index
    if err := db.Table("User").
        DropUniqueIndex("CountryCode", "PhoneNumber"); err != nil {
        log.Println(err)
    }

    // Drop PrimaryKey
    if err := db.Table("User").DropUniqueIndex("__key__"); err != nil {
        log.Println(err)
    }
  • Drop Database
    // This will throw error if table is not exist
    if err := db.Table("User").Drop(); err != nil {
        log.Println(err) // error while retrieving record or record not found
    }

    // Drop table if exists
    if err := db.Table("User").DropIfExists(); err != nil {
        log.Println(err) // error while retrieving record or record not found
    }
  • Drop Database
    // This will throw error if table is not exist
    if err := db.Table("User").Drop(); err != nil {
        log.Println(err) // error while retrieving record or record not found
    }

    // Drop table if exists
    if err := db.Table("User").DropIfExists(); err != nil {
        log.Println(err) // error while retrieving record or record not found
    }
  • Table Locking (only effective inside RunInTransaction)
    // Example
    userKey := datastore.IDKey("User", int64(4645436182170916864), nil)
    if err := db.RunInTransaction(func(txn *goloquent.Connection) error {
        user := new(User)

        if err := txn.Table("User").
            LockForUpdate(). // Lock record for update
            Find(userKey, user); err != nil {
            return err
        }

        if err := txn.Table("User").Update(user); err != nil {
            return err // return any err to rollback the transaction
        }

        return nil // return nil to commit the transaction
    }); err != nil {
        log.Println(err)
    }
  • Sum Column
    // Example
    n, err := db.Table("User").Sum("Age")
    if err != nil {
        log.Println(err) // error while sum record
    }
  • Filter Query
    // Update single record
    user := new(User)
    if err := db.Table("User").
        Where("Status", "IN", []string{"active", "pending"}).
        First(user); err != nil {
        log.Println(err) // error while retrieving record or record not found
    }

    // Get record with like
    if err := db.Table("User").
        Where("Name", "LIKE", "%name%").
        First(user); err != nil {
        log.Println(err) // error while retrieving record or record not found
    }
  • Update Query
    // Update single record
    user := new(User)
    user.Key = datastore.IDKey("User", 167393, nil)
    user.Name = "Test"
    if err := db.Table("User").Update(user); err != nil {
        log.Println(err) // error while retrieving record or record not found
    }

    // Update multiple record
    if err := db.Table("User").
        Where("Age", ">", 10).
        Update(map[string]interface{}{
            "Name": "New Name",
            "Email": "[email protected]",
            "UpdatedDateTime": time.Now().UTC(),
        }); err != nil {
        log.Println(err) // error while retrieving record or record not found
    }
  • Extra Schema Option
type datetime struct {
    CreatedDateTime time.Time // `CreatedDateTime`
    UpdatedDateTime time.Time // `UpdatedDateTime`
}

// Fields may have a `goloquent:"name,options"` tag.
type User struct {
    Key     *datastore.Key `goloquent:"__key__"` // Primary Key
    Name    string `goloquent:",longtext"` // Using `TEXT` datatype instead of `VARCHAR(255)` by default
    Age     int    `goloquent:",unsigned"` // Unsigned option only applicable for int data type
    PhoneNumber string `goloquent:",nullable"`
    Email   string `goloquent:",unique"`   // Make column `Email` as unique field
    Extra   string `goloquent:"-"` // Skip this field to store in db
    DefaultAddress struct {
        AddressLine1 string // `DefaultAddress.AddressLine1`
        AddressLine2 string // `DefaultAddress.AddressLine2`
        PostCode     int    // `DefaultAddress.PostCode`
        City         string // `DefaultAddress.City`
        State        string // `DefaultAddress.State`
        Country      string
    } `goloquent:",flatten"` // Flatten the struct field
    datetime // Embedded struct
}

We follow google datastore standard, only supports data type as following :

- string
- int, int8, int16, int32 and int64 (signed integers)
- bool
- float32 and float64
- []byte
- any type whose underlying type is one of the above predeclared types
- *datastore.Key
- datastore.GeoPoint
- goloquent.SoftDelete
- time.Time (pointer time is not support)
- structs whose fields are all valid value types
- pointers to structs whose fields are all valid value types
- slices of any of the above
Data Type Schema Default Value
*datastore.Key varchar(20), varchar(767)
datastore.GeoPoint varchar(50) {Lat: 0, Lng: 0}
string varchar(255) ""
[]byte mediumblob
bool boolean false
float32 decimal(10,2) 0
float64 decimal(10,2) 0
int, int8, int16, int32 int 0
int64 big integer 0
slice or array text ""
struct text ""
time.Time datetime 0001-01-01 00:00:00

$Key, $Parent, $PrimaryKey and DeletedAt are reserved words, please avoid to use these words as your column name

MIT License

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].