Last active
March 9, 2024 00:32
-
-
Save joshnuss/6837696 to your computer and use it in GitHub Desktop.
Elixir example code for accessing mnesia databases
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# define a record, first attribute is considered the key | |
defrecord User, email: "", first: "", last: "" | |
# encapsulates mnesia calls | |
defmodule Database do | |
def create_schema do | |
create_table User | |
end | |
def find(record, id) do | |
:mnesia.read(record, id) | |
end | |
def write(object) do | |
:mnesia.write(object) | |
end | |
def delete(user=User[]), do: nil # dont allow deleting user | |
def delete(object) do # everything else ok to delete :) | |
:mnesia.delete_object(object) | |
end | |
defp create_table(record) do | |
:mnesia.create_table record, [{:attributes, Dict.keys(record.__record__(:fields))}] | |
end | |
end | |
# start the database | |
:mnesia.start | |
# create the User table | |
Database.create_schema | |
# insert records | |
{:atomic, :ok} = :mnesia.transaction fn -> | |
Database.write(User.new(email: "[email protected]", first: "John", last: "Smith")) | |
Database.write(User.new(email: "[email protected]", first: "Jane", last: "Smith")) | |
end | |
# read a record by key | |
{:atomic, user} = :mnesia.transaction fn -> | |
Database.find(User, "[email protected]") | |
end | |
IO.puts("Found user #{inspect user}") | |
# delete the user | |
:mnesia.transaction fn -> | |
Database.delete(user) | |
end | |
# query with qlc. finds all users with last name == "Smith" | |
{:atomic, users} = :mnesia.transaction fn -> | |
query = :qlc.q(lc u inlist :mnesia.table(User), u.last == "Smith", do: u) | |
:qlc.e(query) | |
end | |
IO.puts("Found results #{inspect users}") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Trying to run in
iex
:** (CompileError) iex:19: undefined function lc/1