{"slug": "ecto", "name": "Ecto", "category": "databases", "category_name": "Databases", "description": "", "recommenders": 5, "commenters": 9, "warners": 0, "score": 5.501, "rising": -1.64, "first": "2025-11-06", "latest": "2026-09-02", "why": "check out ecto, i would say it has less magic than django", "why_is_quote": true, "has_verdict": false, "sentiment": {"recommend": 6, "neutral": 4, "compare": 0, "warn": 0}, "spark": [1, 0, 1, 0, 2, 0, 0, 0, 2, 0, 0, 0], "listed": true, "loved": [], "caveat": "", "short_quote": "check out ecto, i would say it has less magic than django", "kind": "", "icon": true, "domain": "hexdocs.pm", "github_repo": null, "official_url": "https://hexdocs.pm/ecto", "pricing": "", "aliases": ["Ecto"], "verdict": null, "praise": [{"label": "", "summary": "", "quotes": [{"id": 785041872, "item_id": 49065117, "url": "https://news.ycombinator.com/item?id=49065117", "by": "dnautics", "date": "2026-07-26", "version": null, "stance": "recommend", "quote": "i use elixir/ecto.  just write a migration!", "excerpt": "automatic migrations terrifies me. i use elixir/ecto. just write a migration! besides, some times you might want more than one schema for a db table (e.g. one with minimal information, for menus, dropdowns etc, and one with full information for your full CRUD operations)", "context": "", "use_case": "database migrations", "switched_from": "", "story": "Some more things about Django I've been enjoying"}, {"id": 780676352, "item_id": 48792272, "url": "https://news.ycombinator.com/item?id=48792272", "by": "andy_ppp", "date": "2026-07-05", "version": null, "stance": "recommend", "quote": "as little magic as possible", "excerpt": "No ORMs try to make the concept of SQL hidden, in Elixir you will not get very far if you don\u2019t understand the SQL you\u2019re trying to write. So I\u2019d probably say nothing is really being hidden from you - as little magic as possible. https://ecto.hexdocs.pm/Ecto.Query.html", "context": "", "use_case": "", "switched_from": "", "story": "What ORMs have taught me: just learn SQL (2014)"}, {"id": 759333504, "item_id": 47458344, "url": "https://news.ycombinator.com/item?id=47458344", "by": "liampulles", "date": "2026-03-20", "version": null, "stance": "recommend", "quote": "it has a pretty good query building type solution", "excerpt": "I use Ecto with Elixir in my day job, and it has a pretty good query building type solution. BUT: I still regularly come into issues where I have to use a fragment in order to do the specific SQL operation that I want, or I start my app and it turns out it has not caught the issue with my query (relating to my specific MySQL version or whatever). Which unfortunately defeats the purpose. My experience with something l", "context": "Uses Elixir at day job", "use_case": "Elixir query building", "switched_from": "", "story": "Java Is Fast. Your Code Might Not Be"}, {"id": 755514448, "item_id": 47219653, "url": "https://news.ycombinator.com/item?id=47219653", "by": "linkdd", "date": "2026-03-02", "version": null, "stance": "recommend", "quote": "\"ecto\" that handles all of this for you", "excerpt": "You would have a process handling the calls to the postgres. That process has as local state the database connection and receive messages that are translated to SQL queries, here 2 scenarios are possible: 1) The query is invalid (you are trying to inert a row with a missing foreign key, or wrong data type). In that case, you send the error back to the caller. 2) There is a network problem between your application and", "context": "", "use_case": "Database access (Elixir)", "switched_from": "", "story": "Process-Based Concurrency: Why Beam and OTP Keep Being Right"}, {"id": 748663152, "item_id": 46791447, "url": "https://news.ycombinator.com/item?id=46791447", "by": "dnautics", "date": "2026-01-27", "version": null, "stance": "recommend", "quote": "check out ecto, i would say it has less magic than django", "excerpt": "if you want \"less magic than rails\" check out ecto, i would say it has less magic than django", "context": "", "use_case": "", "switched_from": "", "story": "Notes on Starting to Use Django"}]}], "caveats": [], "who": [{"by": "liampulles", "context": "Uses Elixir at day job", "url": "https://news.ycombinator.com/item?id=47458344", "date": "2026-03-20"}], "tags": [], "use_cases": ["database connection pooling", "database migrations", "data validation and changesets", "elixir query building", "database access (elixir)"], "compared": [{"slug": "phoenix", "name": "Phoenix", "co": 4, "switched_from": 0, "switched_to": 0}, {"slug": "claude-code", "name": "Claude Code", "co": 2, "switched_from": 0, "switched_to": 0}, {"slug": "postgresql", "name": "PostgreSQL", "co": 2, "switched_from": 0, "switched_to": 0}, {"slug": "django", "name": "Django", "co": 2, "switched_from": 0, "switched_to": 0}, {"slug": "claude", "name": "Claude", "co": 2, "switched_from": 0, "switched_to": 0}], "makers": [{"id": 773875728, "item_id": 48367233, "url": "https://news.ycombinator.com/item?id=48367233", "by": "josecodea", "date": "2026-06-02", "version": null, "stance": "recommend", "quote": "shipped patches to Ecto, Phoenix LiveView, PostGraphile, and PowerSync", "excerpt": "Location: Costa Rica (GMT-6) Remote: Yes Willing to relocate: No Technologies: TypeScript, Elixir, Rust, Node.js, React, GraphQL, PostgreSQL, NixOS, Docker, AWS R\u00e9sum\u00e9/CV: contact for full CV, portfolio with OSS contributions at https://josecodea.com Email: look into my portfolio above Freelance developer and consultant. I contribute to the frameworks your stack runs on \u2014 shipped patches to Ecto, Phoenix LiveView, Po", "context": "", "use_case": "", "switched_from": "", "story": "Ask HN: Who wants to be hired? (June 2026)"}], "threads": [{"url": "https://news.ycombinator.com/item?id=49522896", "title": "Ask HN: Who wants to be hired? (September 2026)", "mentions": 1}, {"url": "https://news.ycombinator.com/item?id=49277952", "title": "Does anyone run Postgres without PgBouncer?", "mentions": 1}, {"url": "https://news.ycombinator.com/item?id=48997828", "title": "Some more things about Django I've been enjoying", "mentions": 1}, {"url": "https://news.ycombinator.com/item?id=48742175", "title": "What ORMs have taught me: just learn SQL (2014)", "mentions": 1}, {"url": "https://news.ycombinator.com/item?id=48388324", "title": "Elixir v1.20 released: now a gradually typed language", "mentions": 1}, {"url": "https://news.ycombinator.com/item?id=48357724", "title": "Ask HN: Who wants to be hired? (June 2026)", "mentions": 1}], "sentiment_by_month": {"2025-11": {"recommend": 1}, "2025-12": {}, "2026-01": {"recommend": 1}, "2026-02": {}, "2026-03": {"recommend": 2}, "2026-04": {"neutral": 1}, "2026-05": {}, "2026-06": {"neutral": 1}, "2026-07": {"recommend": 2}, "2026-08": {"neutral": 1}, "2026-09": {"neutral": 1}, "2026-10": {}}, "versions": [], "version_unnamed": 0, "family_ref": null, "runs_on": null, "lines": [], "quotes": [{"id": 792641030, "item_id": 49540064, "url": "https://news.ycombinator.com/item?id=49540064", "by": "entaroadun123", "date": "2026-09-02", "version": null, "stance": "neutral", "quote": "onto Elixir, Phoenix and Ecto", "excerpt": "Location: Renton, Washington (US Pacific) Remote: Yes, remote only Willing to relocate: No Technologies: Ruby on Rails, PostgreSQL, Sidekiq, Hotwire, Python, TypeScript/React, Go, Elixir/Phoenix/Ecto, AWS, Kubernetes, Playwright Resume: https://levelbrook-resume.s3.amazonaws.com/levelbrook-consulting-resume.pdf Email: levelbrookteam@gmail.com I run Levelbrook Consulting, a Rails-first practice on the US west coast. T", "context": "", "use_case": "", "switched_from": "", "story": "Ask HN: Who wants to be hired? (September 2026)"}, {"id": 789154032, "item_id": 49322127, "url": "https://news.ycombinator.com/item?id=49322127", "by": "recroad", "date": "2026-08-16", "version": null, "stance": "neutral", "quote": "I use the Ecto connection pool when using Elixir/Phoenix.", "excerpt": "I use the Ecto connection pool when using Elixir/Phoenix.", "context": "", "use_case": "database connection pooling", "switched_from": "", "story": "Does anyone run Postgres without PgBouncer?"}, {"id": 785041872, "item_id": 49065117, "url": "https://news.ycombinator.com/item?id=49065117", "by": "dnautics", "date": "2026-07-26", "version": null, "stance": "recommend", "quote": "i use elixir/ecto.  just write a migration!", "excerpt": "automatic migrations terrifies me. i use elixir/ecto. just write a migration! besides, some times you might want more than one schema for a db table (e.g. one with minimal information, for menus, dropdowns etc, and one with full information for your full CRUD operations)", "context": "", "use_case": "database migrations", "switched_from": "", "story": "Some more things about Django I've been enjoying"}, {"id": 780676352, "item_id": 48792272, "url": "https://news.ycombinator.com/item?id=48792272", "by": "andy_ppp", "date": "2026-07-05", "version": null, "stance": "recommend", "quote": "as little magic as possible", "excerpt": "No ORMs try to make the concept of SQL hidden, in Elixir you will not get very far if you don\u2019t understand the SQL you\u2019re trying to write. So I\u2019d probably say nothing is really being hidden from you - as little magic as possible. https://ecto.hexdocs.pm/Ecto.Query.html", "context": "", "use_case": "", "switched_from": "", "story": "What ORMs have taught me: just learn SQL (2014)"}, {"id": 774313984, "item_id": 48394624, "url": "https://news.ycombinator.com/item?id=48394624", "by": "asa400", "date": "2026-06-03", "version": null, "stance": "neutral", "quote": "Ecto Changesets[0] are runtime constructs, yes.", "excerpt": "Ecto Changesets[0] are runtime constructs, yes. They're similar to libaries like Pydantic, if you're familiar with Python. [0] - https://ecto.hexdocs.pm/Ecto.Changeset.html", "context": "", "use_case": "Data validation and changesets", "switched_from": "", "story": "Elixir v1.20 released: now a gradually typed language"}, {"id": 762306995, "item_id": 47644187, "url": "https://news.ycombinator.com/item?id=47644187", "by": "beerscb", "date": "2026-04-04", "version": null, "stance": "neutral", "quote": "Technologies: Elixir, Phoenix, LiveView, Ecto", "excerpt": "Location: Columbus, OH Remote: Yes (preferred) Willing to relocate: Yes, for the right opportunity Technologies: Elixir, Phoenix, LiveView, Ecto, PostgreSQL, Clojure, Python, JavaScript/React, Docker, Linux, AWS (Certified Cloud Practitioner), Git, CI/CD. Currently building RAG and LLM tooling. R\u00e9sum\u00e9/CV: https://github.com/caleb-bb (happy to send full r\u00e9sum\u00e9 by email) Email: beerscb@gmail.com Backend/distributed sys", "context": "", "use_case": "", "switched_from": "", "story": "Ask HN: Who wants to be hired? (April 2026)"}, {"id": 759333504, "item_id": 47458344, "url": "https://news.ycombinator.com/item?id=47458344", "by": "liampulles", "date": "2026-03-20", "version": null, "stance": "recommend", "quote": "it has a pretty good query building type solution", "excerpt": "I use Ecto with Elixir in my day job, and it has a pretty good query building type solution. BUT: I still regularly come into issues where I have to use a fragment in order to do the specific SQL operation that I want, or I start my app and it turns out it has not caught the issue with my query (relating to my specific MySQL version or whatever). Which unfortunately defeats the purpose. My experience with something l", "context": "Uses Elixir at day job", "use_case": "Elixir query building", "switched_from": "", "story": "Java Is Fast. Your Code Might Not Be"}, {"id": 755514448, "item_id": 47219653, "url": "https://news.ycombinator.com/item?id=47219653", "by": "linkdd", "date": "2026-03-02", "version": null, "stance": "recommend", "quote": "\"ecto\" that handles all of this for you", "excerpt": "You would have a process handling the calls to the postgres. That process has as local state the database connection and receive messages that are translated to SQL queries, here 2 scenarios are possible: 1) The query is invalid (you are trying to inert a row with a missing foreign key, or wrong data type). In that case, you send the error back to the caller. 2) There is a network problem between your application and", "context": "", "use_case": "Database access (Elixir)", "switched_from": "", "story": "Process-Based Concurrency: Why Beam and OTP Keep Being Right"}, {"id": 748663152, "item_id": 46791447, "url": "https://news.ycombinator.com/item?id=46791447", "by": "dnautics", "date": "2026-01-27", "version": null, "stance": "recommend", "quote": "check out ecto, i would say it has less magic than django", "excerpt": "if you want \"less magic than rails\" check out ecto, i would say it has less magic than django", "context": "", "use_case": "", "switched_from": "", "story": "Notes on Starting to Use Django"}, {"id": 748138018, "item_id": 46758626, "url": "https://news.ycombinator.com/item?id=46758626", "by": "dnautics", "date": "2026-01-25", "version": null, "stance": "recommend", "quote": "I've never once run into the ecto issues mentioned.", "excerpt": "ok, so im \"vibe-\" building out my company's lab notebook in elixir ahead of the first funding check coming in. im doing some heavy duty shit, almost everything is routed through a custom CQRS-style events table before rollup into the db tables (for lab notebook integrity). editing is done through a custom implementation of quill js's delta OT. 100% of my tests are async. I've never once run into the ecto issues menti", "context": "", "use_case": "", "switched_from": "", "story": "150k lines of vibe coded Elixir: The Good, the Bad and the Ugly"}, {"id": 733501826, "item_id": 45843864, "url": "https://news.ycombinator.com/item?id=45843864", "by": "Joel_Mckay", "date": "2025-11-06", "version": null, "stance": "recommend", "quote": "Erlang/Elixir abstracts most db use-cases with ecto", "excerpt": "There are JS frameworks that port to most platforms in about 3 minutes (use a Mac for iOS builds): https://quasar.dev/introduction-to-quasar/ That being said, Erlang/Elixir abstracts most db use-cases with ecto, and has some other incredibly powerful scalable features for sites: https://www.phoenixframework.org/ * Distributed * Fault-tolerant * Highly available * Hot swapping Depends on the use-case, but if your prod", "context": "", "use_case": "", "switched_from": "", "story": "From web developer to database developer in 10 years"}]}