hauleth

hauleth

Ecto supports SQL views, even though these aren’t used that often. I think that one of the main reasons why these aren’t used is that creating them in migrations isn’t that simple (another one is that plain, non-materialised, views aren’t that needed when using Ecto).

I decided to write small library that will help with that.

This provide 2 functionalities:

Simplify writing views by utilising familiar Ecto.Query:

defmodule MyApplication.Repo.Migration.CreateViewFoo do
  use Ecto.Migration
  use EctoView.Migration # This line **MUST** be after `use Ecto.Migration`

  def change do
    query = from foo in "foos", # This **MUST** select from table name, no schemas allowed
      where: foo.bar == 2137,
      select: %{ # This **MUST** be a map of selected fields
        a: foo.a,
        b: foo.b
      }

    create view("foos_view", query)
  end
end

This will create view foos_view that is created with query SELECT a AS a, b AS b FROM foos.

There are restrictions for queries though - due to nature of migrations, we cannot rely on schemas in application, so the query must use raw table names passed as string. In addition to that, we need to provide select which must be a map of selected values.

Materialised views can be created the same way as plain views, just use materialised_view/2 instead of view/2.

Additional functionality is helper function for refreshing materialised views:

defmodule MyApplication.Repo do
  use Ecto.Repo, # …
  use EctoView

  # …
end

And now you can use Repo.refresh_materialized_view("my_view") to refresh content of that view.

There currently is no mechanism to automate refreshments of materialised views and that is left to the user to implement one.

Showing Posts 1 to 2

al2o3cr

al2o3cr

Haven’t tried it yet, but would it work to declare the specific schema-bits that the migration cares about locally (inside defmodule MyApplication.Repo.Migration.CreateViewFoo)?

That’s an Elixir translation of an approach I’ve used before in Rails migrations.

hauleth

hauleth OP

Theoretically you could, but IMHO that wouldn’t be that different from simply using select in query with a map. Writing something like:

defmodule MyApplication.Repo.Migration.CreateViewFoo do
  use Ecto.Migration
  use EctoView.Migration # This line **MUST** be after `use Ecto.Migration`

  defmodule Foo do
    use EctoView.Schema

    migration_schema "foos" do
      field :a
      field :b
      field :bar
    end
  end

  def change do
    query = from foo in Foo,
      where: foo.bar == 2137,

    create view("foos_view", query)
  end
end

For me isn’t more readable. It introduces needless new module and a lot of visual cruft, where simple Ecto.Query can contain all that information without need for such magic.

— All posts loaded —

Where Next? Top

Trending in Announcing Top

type1fool
WebAuthnLiveComponent WebAuthnComponents See this post about renaming the package. Passwordless authentication for Phoenix LiveView app...
New
mudasobwa
I fully migrated to my own harness from Anthropic/Gemini and I think it’s time to share it. Welcome DSH, the DeepSeek Harness, fully writ...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
ausimian
Emily is an Elixir library that runs Nx computations on Apple’s MLX. Install it as the default Nx backend and Nx, defn, Axon, Nx.Serving,...
New
kip
In 2021 I started a new library called Tempo with the objective of modelling time as a set of intervals - not as instants. In 2022 I gave...
New
quatermain
Hello, I’m sharing my plugin here in forum after some time so it has time to mature and proof yourself. I use Claude Code daily on a pr...
New
gtcode
Aloha gang, There’s a new class of AI model out from TypeSafe. Jev is their flagship model. You can learn about it here: ...
New

Other Trending Topics Top

dominicletz
Hey there, I haven’t seen a list of useful Elixir specific skills for the popular AI tools yet so I’m starting one here with my first. ...
New
KristerV
Hey. Is there anyone here who creates agents in their apps? Not talking about using agents, but creating them. I’m finding it pretty diff...
New
webofbits
With AI doing more of the implementation work, I’ve been wondering how much coding I should deliberately keep doing myself. My main conc...
#ai
New
OndrejValenta
(I just needed to vent somewhere and LinkedIn is full of hope, or hype, I’m not sure which exactly) AI dream has many faces, but general...
New
alexslade
Fly’s CEO posted this recently - Turn And Face The Strange · The Fly Blog It says that Fly is going all-in on sprites, which is a worry ...
New
CodeSync
Code BEAM Europe 2026 – Call for Talks is Open! We’re excited to announce that Code BEAM Europe 2026 is now open for talk submissions :t...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews