acrolink
How to set id value in code upon entity creation
I have a special need to set the id of newly created entities to some integer relating to UNIX timestamp (not autoincrement based). Any idea how to do this? i am using Phoenix 1.3. Thank you.
Marked As Solved
voger
Hello. Here is the example repo. GitHub - voger/custom_id_test: example phoenix project for custom ids · GitHub
It took me a while to make the pgsql function work
and I didn’t have much time to add controllers or example of custom id using changesets. This example demonstrates how to do it using the database with a sequence as in the link from tomconry. Take a look at the migration.
To use it after you clone it in your computer and do the migrations run iex -S mix and try
iex(1)> alias CustomIdTest.Context
CustomIdTest.Context
iex(2)> Context.create_entry(%{entry: "Reandom text"})
[debug] QUERY OK db=28.5ms queue=0.2ms
INSERT INTO "entry_fragment" ("entry") VALUES ($1) ["Reandom text"]
{:ok,
%CustomIdTest.EntryFragment{__meta__: #Ecto.Schema.Metadata<:loaded, "entry_fragment">,
entry: "Reandom text", id: nil}}
iex(3)> Context.get_entries
[debug] QUERY OK source="entry_fragment" db=4.6ms decode=18.1ms queue=0.2ms
SELECT e0."id", e0."entry" FROM "entry_fragment" AS e0 []
[%CustomIdTest.EntryFragment{__meta__: #Ecto.Schema.Metadata<:loaded, "entry_fragment">,
entry: "random", id: 1616258530136822785},
%CustomIdTest.EntryFragment{__meta__: #Ecto.Schema.Metadata<:loaded, "entry_fragment">,
entry: "random", id: 1616258765361779714},
%CustomIdTest.EntryFragment{__meta__: #Ecto.Schema.Metadata<:loaded, "entry_fragment">,
entry: "Reandom text", id: 1616264079603667971}]
Update:
@acrolink
I added another example on how to set the id from the changeset. This time I used a generator to speed up and you can see the results in a browser. I probably messed up naming and spelling because it was done in a hurry. I hope it doesn’t mind. ![]()
To use it go to http://localhost:4000/things_with_changeset
Especially interesting I believe are [the migration] (custom_id_test/priv/repo/migrations/20171002055049_create_things_with_changeset.exs at master · voger/custom_id_test · GitHub ) and the schema
I modified the controller with this line alias CustomIdTest.CustomIdTest, as: CIT and renamed the relevant function calls. This is irrelevant to the problem at hand. I only did this because I messed up the naming. You don’t have to do this in your controllers.
It is not a well thought example but I hope it helps.
Also Liked
tomconroy
Try doing it with a Postgres function, like this
http://rob.conery.io/2014/05/28/a-better-id-generator-for-postgresql/
idi527
Sorry, I’ve probably confused you …
The example with defstruct that I’ve provided seems to not be what you want. I just wondered if you were asking about ecto or elixir structs.
Judging by the error you get, you were asking about ecto.
To get custom ids you should use @primary_key.
voger
@idi527: Sorry, I accidentally hit reply in your post. This reply was meant for the original post.
If your question is about how to do custom primary keys with Ecto then here is a guide in phoenix blog
http://phoenixframework.org/blog/custom-primary-key
Last Post!
voger
Hello. I don’t have access to elixir right now so I can’t test what I say is accurate. Anyway here is my attempt
If you need autoincrementing bigint you may not need to do anything. [According to the docs]
(https://hexdocs.pm/ecto/Ecto.Migration.html#content)
:migration_primary_key - Ecto uses the :id column with type :bigserial but you can configure it via:
config :app, App.Repo, migration_primary_key: [id: :uuid, type: :binary_id]
So it seems Ecto already uses an autoincrementing bigint as an :id. Not the full range. Only the positive values
If for some reason you don’t want autoincrementing values then you do this in your schema
def change do
create table(:books, primary_key: false) do
add :id, :bigint, primary_key: true
add :title, :string
timestamps()
end
but now you have to handle the key yourself.
Again, I can’t test the accuracy of the above.
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #security
- #hex









