QuickCrud

Generate CRUD functions for your Ecto schemas with zero boilerplate.

QuickCrud is an Elixir library that automatically generates common CRUD operations for your Ecto schemas using macros. Instead of writing repetitive context functions, define them once and get a full suite of database operations.

Why QuickCrud?

Quick Start

Add QuickCrud to your dependencies:

def deps do
[
{:quick_crud, "~> 0.1.0"}
]
end

Define your context with generated CRUD operations:

defmodule MyApp.Accounts do
require QuickCrud
import Ecto.Query
@resource QuickCrud.config(User, MyApp.Repo, "users")
# Generate common CRUD functions
QuickCrud.list(@resource)
QuickCrud.get!(@resource)
QuickCrud.get(@resource)
QuickCrud.create(@resource, &User.changeset/2)
QuickCrud.update(@resource, &User.changeset/2)
QuickCrud.delete(@resource)
# Generate helpful utilities
QuickCrud.paginate(@resource)
QuickCrud.get_by_attr(@resource, :email)
QuickCrud.preload(@resource, :posts)
QuickCrud.order_by(@resource, :inserted_at, :desc)
end

Now you have a full suite of functions:

# Basic CRUD
{:ok, user} = Accounts.create_user(%{name: "Alice", email: "alice@example.com"})
users = Accounts.list_users()
user = Accounts.get_user!(123)
{:ok, updated_user} = Accounts.update_user(user, %{name: "Alice Smith"})
{:ok, _} = Accounts.delete_user(user)
# Utilities
user = Accounts.get_user_by_email("alice@example.com")
%{entries: users, total: count} = Accounts.paginate_users([], 1, 10)
users = Accounts.list_users(preload: [:posts, :company])

Generated Functions

Core CRUD Operations

MacroGenerated FunctionDescription
list/1list_users/1List all records with optional filtering
get/1get_user/2Get record by ID (returns nil if not found)
get!/1get_user!/2Get record by ID (raises if not found)
create/2create_user/1Create new record
update/2update_user/2Update existing record
delete/1delete_user/1Delete record
change/2change_user/2Generate changeset for forms

Query Helpers

MacroGenerated FunctionDescription
paginate/1paginate_users/3Paginated results with metadata
get_by_attr/2get_user_by_email/2Find by specific attribute
preload/2preload_user_posts/1Add preload to query
join/2join_user_company/1Join with association
order_by/3order_users_by_name/1Add ordering to query
filter_by_one/2filter_users_by_company/2Filter by association

Advanced Usage

Complex Queries with Filtering

# Filter with where conditions
users = Accounts.list_users(
where: [active: true, role: "admin"]
)
# OR conditions
users = Accounts.list_users(
where: {[], [role: "admin"], or: [role: "moderator"]}
)
# With preloads and ordering
users = Accounts.list_users(
where: [active: true],
preload: [:company, :posts],
order_by: [desc: :inserted_at]
)

Association Helpers

# Get user belonging to a company
QuickCrud.get_for!(@resource, :company)
user = Accounts.get_user_for_company!(company)
# Filter users by company
QuickCrud.filter_by_one(@resource, :company)
users = Accounts.filter_users_by_company(query, company)

Custom Upserts

# Upsert with custom conflict resolution
QuickCrud.upsert(@resource, &User.changeset/2,
on_conflict: {:replace, [:name, :updated_at]},
conflict_target: :email
)

Pagination

# Get paginated results
%{entries: users, total: total_count, page: 1, per_page: 10} =
Accounts.paginate_users([], 1, 10)
# With filtering
%{entries: users, total: total_count} =
Accounts.paginate_users([where: [active: true]], 2, 25)

Configuration

The QuickCrud.config/3 function sets up your resource configuration:

@resource QuickCrud.config(
User, # Your Ecto schema
MyApp.Repo, # Your Ecto repo
"users" # Plural name for function generation
)

Philosophy

QuickCrud follows Phoenix context conventions and generates functions that feel natural in your application. It doesn't replace custom business logic - it eliminates the repetitive CRUD boilerplate so you can focus on what makes your application unique.

Requirements

Documentation

Full documentation is available at https://hexdocs.pm/quick_crud.

Contributing

We welcome contributions! Please see our Contributing Guide for details.

License

QuickCrud is released under the MIT License. See LICENSE for details.