Sqlite.Ecto2
is a SQLite3 Adapter for Ecto 2.x.
IMPORTANT!!!! This is an experimental port and does not work yet. It's entirely possible that I'll play with this for a while and abandon it; it's also entirely possible that it will lead to a viable adapter for Ecto 2.x.
If you're able to use Ecto 1.x, please look at sqlite_ecto, on which this project is based.
The remainder of this README is held over from the 1.x version of this project. If this project is ultimately successful, we'll revise the documentation accordingly. For now, consider it inaccurate. Such is life on the bleeding edge.
Read the tutorial for a detailed example of how to setup and use a SQLite repo with Ecto, or just check-out the CliffsNotes in the sections below if you want to get started quickly.
OTP 19.0.x appears to have a bug that causes it to misinterpret certain pattern matches. This causes the unit tests for sqlite_ecto to fail on some platforms when hosted on OTP 19.0.x. This bug did not appear in OTP 18.0 and appears to have been fixed for OTP 19.1. Consequently, we strongly advise you to avoid using OTP 19.0.x when running sqlite_ecto, especially if using decimal
value types.
Note that the Travis configuration for this repo specifically excludes OTP 19.0 for this reason.
Sqlite.Ecto
relies on Sqlitex and esqlite. Since esqlite uses Erlang NIFs, you will need a valid C compiler to build the library.
Here is an example usage:
# In your config/config.exs file config :my_app, Repo, adapter: Sqlite.Ecto, database: "ecto_simple.sqlite3" # In your application code defmodule Repo do use Ecto.Repo, otp_app: :my_app, adapter: Sqlite.Ecto end defmodule Weather do use Ecto.Model schema "weather" do field :city # Defaults to type :string field :temp_lo, :integer field :temp_hi, :integer field :prcp, :float, default: 0.0 end end defmodule Simple do import Ecto.Query def sample_query do query = from w in Weather, where: w.prcp > 0 or is_nil(w.prcp), select: w Repo.all(query) end end
Add Sqlite.Ecto
as a dependency in your mix.exs
file.
def deps do [{:sqlite_ecto2, "~> 2.0.0"}] end
You should also update your applications list to include both projects:
def application do [applications: [:logger, :sqlite_ecto2, :ecto]] end
To use the adapter in your repo:
defmodule MyApp.Repo do use Ecto.Repo, otp_app: :my_app, adapter: Sqlite.Ecto end
The changeset functions foreign_key_constraint/3
and unique_constraint/3
are not supported by Sqlite.Ecto
because the underlying SQLite database does not provide enough information when such constraints are violated to support the features.
Note that SQLite does support both unique and foreign key constraints via unique_index/3
and references/2
, respectively. When such constraints are violated, they will raise Sqlite.Ecto.Error
exceptions.
There are a few Ecto options which Sqlite.Ecto
silently ignores because SQLite does not support them and raising an error on them does not make sense:
- Most column options will ignore
size
,precision
, andscale
constraints on types because columns in SQLite have no types, and SQLite will not coerce any stored value. Thus, all "strings" areTEXT
and "numerics" will have arbitrary precision regardless of the declared column constraints. The lone exception to this rule are Decimal types which acceptprecision
andscale
options because these constraints are handled in the driver software, not the SQLite database. - If we are altering a table to add a
DATETIME
column with aNOT NULL
constraint, SQLite will require a default value to be provided. The only default value which would make sense in this situation isCURRENT_TIMESTAMP
; however, when adding a column to a table, defaults must be constant values. Therefore, in this situation theNOT NULL
constraint will be ignored so that a default value does not need to be provided. - When creating an index,
concurrently
andusing
values are silently ignored since they do not apply to SQLite.