Snowpack

CIhex.pm versionhex.pm licenseLast Updated

Snowflake driver for Elixir.

Features

TODO

Usage

Add :snowpack to your dependencies:

def deps() do
  [
    {:snowpack, "~> 0.6.0"}
  ]
end

Make sure you are using the latest version!

opts = [
  connection: [
    role: "DEV",
    warehouse: System.get_env("SNOWFLAKE_WH"),
    uid: System.get_env("SNOWFLAKE_UID"),
    pwd: System.get_env("SNOWFLAKE_PWD")
  ]
]

{:ok, pid} = Snowpack.start_link(opts)
Snowpack.query!(pid, "select current_user()")

Snowpack.query(pid, "SELECT * FROM data")
{:ok,
 %Snowpack.Result{
   columns: ["id", "title"],
   num_rows: 3,
   rows: [[1, "Data 1"], [2, "Data 2"], [3, "Data 3"]]
 }}

It’s recommended to start Snowpack under a supervision tree:

defmodule MyApp.Application do
  use Application

  def start(_type, _args) do
    children = [
      {Snowpack, uid: "snowflake-uid", name: :snowpack}
    ]

    opts = [strategy: :one_for_one, name: MyApp.Supervisor]
    Supervisor.start_link(children, opts)
  end
end

and then we can refer to it by its :name:

Snowpack.query!(:snowpack, "SELECT NOW()").rows
[[~N[2018-12-28 13:42:31]]]

Data representation

Snowflake ODBC       Elixir
-----                ------
NULL                 nil
bool                 true | false
int                  42
float                42.0
decimal              42.0 # (1)
date                 ~D[2013-10-12]
time                 ~T[00:37:14]
datetime             ~N[2013-10-12 00:37:14]  # (2)
timestamp            ~U[2013-10-12 00:37:14Z] # (2)
char                 "é"
text                 "snowpack"
binary               <<1, 2, 3>>
bit                  <<1::size(1), 0::size(1)>>
array                [1, 2, 3]
object               %{key: "value"}

Notes:

  1. See Decimal

  2. Datetime fields are represented as NaiveDateTime, however a UTC DateTime can be used for encoding as well.

Documentation

Documentation is automatically published to hexdocs.pm on release. You may build the documentation locally with

MIX_ENV=docs mix docs

Erlang ODBC on Apple M1

Install Dependencies via Homebrew

brew install asdf openssl@1.1 libiodbc wxwidgets

NOTE: you may need to unlink unixodbc to install and use libiodbc, or replace libiodbc with unixodbc below.

Configure your shell for asdf.

Install asdf plugins.

asdf plugin add erlang
asdf plugin add elixir

Configure the KERL compiler used by asdf.

export CFLAGS="-O2 -g -fno-stack-check"
export KERL_CONFIGURE_OPTIONS="--with-ssl=$(brew --prefix openssl@1.1)/ --with-wx-config=$(brew --prefix wxwidgets)/bin/wx-config --with-odbc=$(brew --prefix libiodbc)"
export CPPFLAGS="-I$(brew --prefix libiodbc)/include"
export LDFLAGS="-L$(brew --prefix libiodbc)/lib"

Install Erlang and Elixir

asdf install erlang 25.0.3
asdf install elixir 1.13.4-otp-25

Contributing

Issues and PRs are welcome! See our organization CONTRIBUTING.md for more information about best-practices and passing CI.