Grimoire is a flexible ORM for golang. It features flexible query API and builtin validation. It currently supports MySQL, PostgreSQL and SQLite3 but a custom adapter can be implemented easily using the Adapter interface.

Programming language: Go
License: MIT License
Tags: SQL     Database     ORM     Validation    
Latest version: v1.5.0

grimoire alternatives and similar packages

Based on the "ORM" category.
Alternatively, view grimoire alternatives based on common mentions on social networks and blogs.

Do you think we are missing an alternative of grimoire or a related project?

Add another 'ORM' Package



GoDoc Build Status Go Report Card Maintainability Test Coverage FOSSA Status

:warning: Grimoire V2 is available as REL and Changeset package.

Grimoire is a database access layer inspired by Ecto. It features a flexible query API and built-in validation. It currently supports MySQL, PostgreSQL, and SQLite3 but a custom adapter can be implemented easily using the Adapter interface.


  • Query Builder
  • Association Preloading
  • Struct style create and update
  • Changeset Style create and update
  • Builtin validation using changeset
  • Multi adapter support
  • Logger


Common go ORM accepts struct as a value for modifying records which has a problem of unable to differentiate between an empty, nil, or undefined value. It's a tricky problem especially when you want to have an endpoint that supports partial updates. Grimoire attempts to solve that problem by integrating Changeset system inspired from Elixir's Ecto. Changeset is a form like entity which allows us to not only solve that problem but also help us with casting, validations, and constraints check.


go get github.com/Fs02/grimoire

Quick Start

package main

import (


type Product struct {
    ID        int
    Name      string
    Price     int
    CreatedAt time.Time
    UpdatedAt time.Time

// ChangeProduct prepares data before database operation.
// Such as casting value to appropriate types and perform validations.
func ChangeProduct(product interface{}, params params.Params) *changeset.Changeset {
    ch := changeset.Cast(product, params, []string{"name", "price"})
    changeset.ValidateRequired(ch, []string{"name", "price"})
    changeset.ValidateMin(ch, "price", 100)
    return ch

func main() {
    // initialize mysql adapter.
    adapter, err := mysql.Open("root@(")
    if err != nil {
    defer adapter.Close()

    // initialize grimoire's repo.
    repo := grimoire.New(adapter)

    var product Product

    // Inserting Products.
    // Changeset is used when creating or updating your data.
    ch := ChangeProduct(product, params.Map{
        "name":  "shampoo",
        "price": 1000,

    if ch.Error() != nil {
        // handle error

    // Changeset can also be created directly from json string.
    jsonch := ChangeProduct(product, params.ParseJSON(`{
        "name":  "soap",
        "price": 2000,

    // Create products with changeset and return the result to &product,
    if err = repo.From("products").Insert(&product, ch); err != nil {
        // handle error

    // or panic when insertion pailed
    repo.From("products").MustInsert(&product, jsonch)

    // Querying Products.
    // Find a product with id 1.

    // Updating Products.
    // Update products with id=1.
    repo.From("products").Find(1).MustUpdate(&product, ch)

    // Deleting Products.
    // Delete Product with id=1.



Guides: https://fs02.github.io/grimoire

API Documentation: https://godoc.org/github.com/Fs02/grimoire


Released under the MIT License

FOSSA Status

*Note that all licence references and agreements mentioned in the grimoire README section above are relevant to that project's source code only.