metaorm v1

MetaORM is a Go package that provides a simplified database interaction layer with support for MySQL, PostgreSQL, and SQLite databases. It includes features for connection management, query building, encryption, environment variable handling, and pagination/sorting utilities.

Repository

Installation

go get -u github.com/metadiv-io/metaorm

Database Connection

Environment Variables

Set up your database connection using environment variables:

METAORM_HOST=localhost
METAORM_PORT=3306
METAORM_USERNAME=root
METAORM_PASSWORD=password
METAORM_DATABASE=mydb
METAORM_ENCRYPT_KEY=your-encryption-key

Connection Examples

package main

import "github.com/metadiv-io/metaorm"

func main() {
    // MySQL Connection
    db, err := metaorm.DefaultMySQL() // Using environment variables
    // or
    db, err := metaorm.MySQL("localhost", "3306", "root", "password", "mydb")

    // PostgreSQL Connection
    db, err := metaorm.DefaultPostgres() // Using environment variables
    // or
    db, err := metaorm.Postgres("localhost", "5432", "postgres", "password", "mydb")

    // SQLite Connection
    db, err := metaorm.SQLite("./database.db")
    // or in-memory
    db, err := metaorm.SqliteMemory()
}

Basic Operations

Model Definition

type User struct {
    ID        uint   `gorm:"primarykey"`
    Name      string
    Email     []byte // Encrypted field
    CreatedAt time.Time
}

CRUD Operations

package main

import (
    "github.com/metadiv-io/metaorm"
    "github.com/metadiv-io/metaorm/executor"
)

func main() {
    db, _ := metaorm.DefaultMySQL()

    // Create
    user := &User{Name: "John", Email: metaorm.DefaultEncrypt("john@example.com")}
    user, err := executor.Save(db, user)

    // Read
    user, err := executor.FindOne[User](db, db.Eq("id", 1))

    // Update
    user.Name = "John Doe"
    user, err = executor.Save(db, user)

    // Delete
    err = executor.Delete(db, user)
}

Querying

Simple Queries

package main

func main() {
    db, _ := metaorm.DefaultMySQL()

    // Single condition
    users, err := executor.FindAll[User](db, db.Eq("name", "John"))

    // Multiple conditions using AND
    query := db.And(
        db.Eq("name", "John"),
        db.Gt("age", 18),
    )
    users, err = executor.FindAll[User](db, query)

    // Multiple conditions using OR
    query = db.Or(
        db.Eq("name", "John"),
        db.Eq("name", "Jane"),
    )
    users, err = executor.FindAll[User](db, query)
}

Advanced Queries

func main() {
    db, _ := metaorm.DefaultMySQL()

    // Like query
    users, err := executor.FindAll[User](db, db.Like("name", "Jo"))

    // In query
    users, err = executor.FindAll[User](db, db.In("id", []int{1, 2, 3}))

    // Null check
    users, err = executor.FindAll[User](db, db.IsNull("deleted_at"))

    // Encrypted field query
    users, err = executor.FindAll[User](db, db.DecryptedEq("email", "john@example.com"))
}

Pagination and Sorting

func main() {
    db, _ := metaorm.DefaultMySQL()

    // Pagination
    page := &metaorm.Page{
        Page: 1,
        Size: 10,
    }

    // Sorting
    sort := &metaorm.Sort{
        Field: "created_at",
        Asc:   false,
    }

    // Complex query with pagination and sorting
    users, page, err := executor.FindAllComplex[User](
        db,
        db.Eq("status", "active"),
        page,
        sort,
    )
}

Encryption

func main() {
    // Encrypt data
    encryptedData := metaorm.DefaultEncrypt("sensitive data")

    // Decrypt data
    plainText := metaorm.DefaultDecrypt(encryptedData)

    // Using custom encryption key
    customKey := "your-custom-key"
    encryptedData = metaorm.Encrypt("sensitive data", customKey)
    plainText = metaorm.Decrypt(encryptedData, customKey)
}

Transactions

func main() {
    db, _ := metaorm.DefaultMySQL()

    // Start transaction
    tx := db.Begin()

    // Perform operations
    user := &User{Name: "John"}
    user, err := executor.Save(tx, user)
    if err != nil {
        tx.Rollback()
        return
    }

    // Commit transaction
    tx.Commit()
}

Additional Features

Preloading Relations

func main() {
    db, _ := metaorm.DefaultMySQL()

    // Preload related data
    db = db.Preload("Posts", "Comments")
    users, err := executor.FindAll[User](db, nil)
}

Joins

func main() {
    db, _ := metaorm.DefaultMySQL()

    // Join related tables
    db = db.Joins("Posts", "Comments")
    users, err := executor.FindAll[User](db, nil)
}

Last updated