So I decided to use UUIDs as primary keys for the resources I am creating in my webapp. The reason is cause I don't like the default one "auto increment integer".
So how to achieve this in Phoenix?
1. Add a custom schema
The idea with the code below is to override Ecto.Schema
with our new config
# lib/your_app/schema.ex
defmodule YourApp.Schema do
defmacro __using__(_) do
quote do
use Ecto.Schema
@primary_key {:id, :binary_id, autogenerate: true}
@foreign_key_type :binary_id
end
end
end
Now, on your schemas you should use use YourApp.Schema
instead of Ecto.Schema
2. Fix your Migration!
This one is a very important step. The reason why is because by default when your run your migration it will try to create your tables using the default id (auto increment integer) to fix this is very simple
# config/config.exs
config :your_app, YourApp.Repo, migration_primary_key: [name: :id, type: :binary_id]
Now when you run your migrations to create your tables the id will be of type binary_id :D.
And that's it. Profit :).
Top comments (2)
Alternatively, if you're starting off fresh, you can just pass in
--binary-id
when creating your Phoenix project, .e.g.mix phx.new --binary-id hello
.How do I use uuid for new table with primary key?