Relational database library for SQL databases & Go.
Alternatives To Crud
Project NameStarsDownloadsRepos Using ThisPackages Using ThisMost Recent CommitTotal ReleasesLatest ReleaseOpen IssuesLicenseLanguage
Superset54,3941610 hours ago6April 18, 20231,523apache-2.0TypeScript
Apache Superset is a Data Visualization and Data Exploration Platform
Tidb34,927681379 hours ago1,289April 07, 20224,370apache-2.0Go
TiDB is an open-source, cloud-native, distributed, MySQL-Compatible database for elastic scale and real-time analytics. Try AI-powered Chat2Query free at :
9 hours ago1June 08, 20223,255otherClojure
The simplest, fastest way to get business intelligence and analytics to everyone in your company :yum:
9 hours ago1,803apache-2.0Java
Free universal database tool and SQL client
5 days ago1February 27, 201857otherPython
Automatic SQL injection and database takeover tool
Cockroach27,88250249 hours ago249August 06, 20215,634otherGo
CockroachDB - the open source, cloud-native distributed SQL database.
Directus23,2871859 hours ago86July 25, 2023299otherTypeScript
The Modern Data Stack 🐰 — Directus is an instant REST+GraphQL API and intuitive no-code data collaboration app for any SQL database.
Surrealdb22,680169 hours ago10April 02, 2023341otherRust
A scalable, distributed, collaborative, document-graph database, for the realtime web
Tdengine21,77629 hours ago12April 14, 20221,197agpl-3.0C
TDengine is an open source, high-performance, cloud native time-series database optimized for Internet of Things (IoT), Connected Cars, Industrial IoT and DevOps.
49 hours ago37July 12, 2022215mitHaskell
REST API for any Postgres database
Alternatives To Crud
Select To Compare

Alternative Project Comparisons


A minimalistic relational database library for Go.

Table of Contents


$ go get


import (
  _ ""

var DB *crud.DB

func init () {
  var err error
  DB, err = crud.Connect("mysql", os.Getenv("DATABASE_URL"))
  err = DB.Ping()


type User struct {
  Id int `sql:"auto-increment primary-key"`
  FirstName string
  LastName string
  ProfileId int

type Profile struct {
  Id int `sql:"auto-increment primary-key"`
  Bio string `sql:"text"`

CRUD will automatically convert column names from "FirstName" (CamelCase) to "first_name" (snake_case) for you. You can still choose custom names though;

type Post struct {
  Slug string `sql:"name=slug_id varchar(255) primary-key required"`

If no primary key is specified, CRUD will look for a field named "Id" with int type, and set it as auto-incrementing primary-key field.

Create & Drop Tables

CreateTables takes list of structs and makes sure they exist in the database.

err := DB.CreateTables(User{}, Profile{})

err := DB.DropTables(User{}, Profile{})
Reset Tables

Shortcut for dropping and creating tables.

err := DB.ResetTables(User{}, Profile{})
SQL Options

CRUD tries to be smart about figuring out the best SQL options for your structs, and lets you choose manually, too. For example;

type Tweet struct {
 Text string `sql:"varchar(140) required name=tweet"`

Above example sets the type of the Text column as varchar(140), makes it required (NOT NULL) and changes the column name as tweet.

Here is the list of the options that you can pass;

  • Types: int, bigint, varchar, text, date, time, timestamp
  • auto-increment / autoincrement / auto_increment
  • primary-key / primarykey / primary_key
  • required
  • default='?'
  • name=?
  • table-name=?

If you'd like a struct field to be ignored by CRUD, choose - as options:

type Foo struct {
 IgnoreMe string `sql:"-"`


Simply pass a struct. It can be pointer or not.

user := &User{1, "Foo", "Bar", 1}
err := DB.Create(user)


Create a row, and read it back from the DB. The values of the struct you passed get resetted to whatever the corresponding DB row has. In the other words, CreateAndRead creates, and reads. So you got fields generated by the DB scanned to your struct, like ID.

Make sure passing a pointer.

user := User{

err := DB.CreateAndRead(&user)

// => 123


You can read single/multiple rows, or custom values, with the Read method.

Reading a single row:

Pass your struct's pointer, and a query;

user := &User{}
err := DB.Read(user, "SELECT * FROM users WHERE id = ?", 1)
// => SELECT * FROM users WHERE id = 1

// => Foo
Reading multiple rows:
users := []*User{}

err := DB.Read(&users, "SELECT * FROM users")
// => SELECT * FROM users

// => 10
Scanning to custom values:
names := []string{}
err := DB.Read(&names, "SELECT name FROM users")
name := ""
err := DB.Read(&name, "SELECT name FROM users WHERE id=1")
totalUsers := 0
err := DB.Read(&totalUsers, "SELECT COUNT(id) FROM users"


Updates matching row in database, returns sql.ErrNoRows nothing matched.

user := &User{}
err := DB.Read(user, "SELECT * FROM users WHERE id = ?", 1)

user.Name = "Yolo"
err := DB.Update(user)


Deletes matching row in database, returns sql.ErrNoRows nothing matched.

err := DB.Delete(&User{
  Id: 1


Use WithContext method to get a DB client with context. Here is an example;

db := DB.WithContext(context.Background())


Use Begin method of a crud.DB instance to create a new transaction. Each transaction will provide you following methods;

  • Commit
  • Rollback
  • Exec
  • Query
  • Create
  • CreateAndRead
  • Read
  • Update
  • Delete
tx, err := DB.Begin(context.Background())

err := tx.Create(&User{
  Name: "yolo"

err := tx.Delete(&User{
  Id: 123

err := tx.Commit()

CRUD generates an ID for each transaction, and uses that for logging queries and the state of the transactions. You can override transaction IDs in some use cases such as having same IDs and ID field keys with your Rest framework generating request IDs;

tx.Id = requestId
tx.IdKey = "requestId"


If you want to see crud's internal logs, specify crud in the LOG environment variable when you run your app. For example;

$ LOG=crud go run myapp.go

Custom Queries

result, err := DB.Query("DROP DATABASE yolo") // or .Exec

Running Tests

DATABASE_URL="?" go test ./...

What's Missing?

  • Hooks: I'm not sure if this is needed, but worths to consider.
  • Foreign Keys: *
  • Make UTF-8 Default: Looks like the default charset is not UTF8.


MIT License

Popular Database Projects
Popular Sql Projects
Popular Data Storage Categories
Related Searches

Get A Weekly Email With Trending Projects For These Categories
No Spam. Unsubscribe easily at any time.