jkwchui

jkwchui

How to establish Ecto Repo from Exsqlite conn in Livebook?

I was very impressed at how easy it is to crack open and do stuff with sqlite in Livebook v0.11; exsqlite gives a conn that everything else in Livebook is built around.

There are many sqlite databases out there, and utilities that can export Airtable to sqlite. I think being able to manipulate this data at the application level would open up many interesting uses (an Elixir Datasette alternative). What I don’t know where to start is bringing in Ecto to define schemas. The standard protocol involves setting up config / repos etc. Is this possible within just a livebook? Where should I start reading up on that?

Marked As Solved

jonatanklosko

jonatanklosko

Creator of Livebook

Hey @jkwchui! If you want to define Ecto schemas in the notebook itself, here’s an example that may give some ideas:

# Ecto

```elixir
Mix.install([
  {:ecto, "~> 3.10"},
  {:ecto_sql, "~> 3.10"},
  {:postgrex, "~> 0.17.3"},
  {:kino, "~> 0.11.0"},
  {:kino_db, "~> 0.2.4"}
])
```

## Setup

```
docker run --rm -it -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=postgres -p 5432:5432 postgres:13.2
```

## Repo

```elixir
defmodule Repo do
  use Ecto.Repo, otp_app: :my_app, adapter: Ecto.Adapters.Postgres
end
```

```elixir
Kino.start_child({Repo, url: "postgres://postgres:postgres@localhost/postgres"})
```

## Queries

```elixir
Ecto.Adapters.SQL.query!(Repo, "create table users (id int)")
```

```elixir
Ecto.Adapters.SQL.query!(Repo, "insert into users values (1)")
```

```elixir
Ecto.Adapters.SQL.query!(Repo, "select * from users")
```

## Ecto migration

```elixir
defmodule Migrations.AddWeatherTable do
  use Ecto.Migration

  def up do
    create table("weather") do
      add(:city, :string, size: 40)
      add(:temp_lo, :integer)
      add(:temp_hi, :integer)
      add(:prcp, :float)

      timestamps()
    end
  end

  def down do
    drop(table("weather"))
  end
end
```

```elixir
Ecto.Migrator.up(Repo, 1, Migrations.AddWeatherTable)
```

## Schema

```elixir
defmodule Weather do
  use Ecto.Schema

  schema "weather" do
    field(:city, :string)
    field(:temp_lo, :integer)
    field(:temp_hi, :integer)
    field(:prcp, :float, default: 0.0)

    timestamps()
  end
end
```

```elixir
weather = %Weather{temp_lo: 0, temp_hi: 23}
Repo.insert!(weather)
```

```elixir
Repo.all(Weather)
|> Kino.DataTable.new()
```
12
Post #2

Also Liked

jkwchui

jkwchui

Thank you @jonatanklosko. That sequence of Repo definition was all I needed! Taking this forward, Ash’s new AshSqlite datalayer works very well, and by defining actions and code_interfaces like

actions do
    defaults [:create, :read, :update, :destroy]

    read :top do
      prepare build(limit: 10, sort: [{:views, :desc}])
    end
  end

It becomes possible to work with the data with functions like MyData.Entries.top!(), then bring that into Explorer data frames, then use the smart cells for interactive explorations.

My early hunch is that this grows smoothly from exploration in Livebook, to standalone Mix project, and then drop-in to an existing Phoenix app.

Where Next?

Popular in Questions Top

pmjoe
I have a relationship of love and hate with Elixir. Lots of things are just absolutely right, but there are some things that are kind of ...
New
lessless
I believe there are people here who are dealing with CSV files import on the daily basis, and since Excel is a really popular tool there ...
New
gshaw
What is the idiomatic way of matching for not nil in Elixir? E.g., First way: defp halt_if_not_signed_in(conn, signed_in_account) when...
New
New
nsuchy
Hi. I’ve noticed that Windows Powershell has it’s own IEX command and you cannot access Elixir’s IEX due to the conflict. This isn’t a cr...
New
script
If I have a string “1000 cfu/ml” . I want to remove the characters and / and space . So the string is like this "1000" What is the ...
New
gonzofish
I’m currently trying to understand how to join three tables using Ecto. All the examples I’ve seen use 2, so maybe I’m just missing somet...
New
shahryarjb
Hello, I have map which I want to convert it to string like this: the map: %{last_name: "tavakkoli", name: "shahryar"} the string I ne...
New
chewm
Hi guys, nice to meet you to the whole forum, I’m new here, I’m trying to configure visual studio code for elixir, right now the intellis...
New
siddhant3030
Hi, I have to write a raw query for one of my project. But till now I have used ecto queries and don’t have much experience writing raw ...
New

Other popular topics Top

freewebwithme
Using vs code and installed ElixirLS: support and debugger. And I got an error popped up on start up says Failed to run ‘elixir’ comma...
New
dotdotdotPaul
Okay, I'm having a heck of a time trying to figure out how to best handle the validation of belongs_to associations in Ecto. I'm sure I'...
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New
William
I would like to know that is there any online source for learning Phoenix Framework for building E-Commerce Store? Any advantage on build...
New
lessless
I believe there are people here who are dealing with CSV files import on the daily basis, and since Excel is a really popular tool there ...
New
yawaramin
In the Dialyzer docs ( http://erlang.org/doc/man/dialyzer.html#requesting-or-suppressing-warnings-in-source-files ), there is a way to tu...
New
_russellb
I want to try my hand at web scraping. What tools/libraries do I need to use. I’m hoping to turn this into something professional so don’...
New
fayddelight
I tried installing elixir 1.11.2 erlang 23.3.4 via asdf in my zsh shell. Enabled the versions locally and globally. When I list them ...
New
stefanluptak
Hello everybody, usually, I use a 29" ultra-wide monitor for VSCode which can easily accomodate explorer (files panel) + file with code ...
New
WestKeys
Currently suffering from paralysis by [HTTP client] analysis. This is rather unusual in Elixirland as there tends to be consensus on the ...
New

We're in Beta

About us Mission Statement