@@ -13,59 +13,63 @@ defmodule Ecto.Adapters.SQLite3 do
1313
1414 * `:database` - The path to the database. In memory is allowed. You can use
1515 `:memory` or `":memory:"` to designate that.
16- * `:default_transaction_mode` - one of `deferred` (default), `immediate`,
17- or `exclusive`. If a mode is not specified in a call to `Repo.transaction/2`,
18- this will be the default transaction mode.
19- * `:journal_mode` - Sets the journal mode for the sqlite connection. Can be
20- one of the following `:delete`, `:truncate`, `:persist`, `:memory`,
21- `:wal`, or `:off`. Defaults to `:wal`.
22- * `:temp_store` - Sets the storage used for temporary tables. Default is
23- `:default`. Allowed values are `:default`, `:file`, `:memory`.
24- * `:synchronous` - Can be `:extra`, `:full`, `:normal`, or `:off`. Defaults
25- to `:normal`.
26- * `:foreign_keys` - Sets if foreign key checks should be enforced or not.
27- Can be `:on` or `:off`. Default is `:on`.
28- * `:cache_size` - Sets the cache size to be used for the connection. This is
29- an odd setting as a positive value is the number of pages in memory to use
30- and a negative value is the size in kilobytes to use. Default is `-64000`.
31- * `:cache_spill` - The cache_spill pragma enables or disables the ability of
32- the pager to spill dirty cache pages to the database file in the middle of
33- a transaction. By default it is `:on`, and for most applications, it
34- should remain so.
16+ * `:default_transaction_mode` - one of `:deferred` (default), `:immediate`, or
17+ `:exclusive`. If a mode is not specified in a call to `Repo.transaction/2`, this
18+ will be the default transaction mode.
19+ * `:journal_mode` - Sets the journal mode for the sqlite connection. Can be one of
20+ the following `:delete`, `:truncate`, `:persist`, `:memory`, `:wal`, or `:off`.
21+ Defaults to `:wal`.
22+ * `:temp_store` - Sets the storage used for temporary tables. Default is `:default`.
23+ Allowed values are `:default`, `:file`, `:memory`.
24+ * `:synchronous` - Can be `:extra`, `:full`, `:normal`, or `:off`. Defaults to `:normal`.
25+ * `:foreign_keys` - Sets if foreign key checks should be enforced or not. Can be
26+ `:on` or `:off`. Default is `:on`.
27+ * `:cache_size` - Sets the cache size to be used for the connection. This is an odd
28+ setting as a positive value is the number of pages in memory to use and a negative
29+ value is the size in kilobytes to use. Default is `-64000`.
30+ * `:cache_spill` - The cache_spill pragma enables or disables the ability of the
31+ pager to spill dirty cache pages to the database file in the middle of a
32+ transaction. By default it is `:on`, and for most applications, it should remain
33+ so.
3534 * `:case_sensitive_like` - whether LIKE is case-sensitive or not. Can be
3635 `:off` or `:on`. Defaults to `:off`.
37- * `:auto_vacuum` - Defaults to `:none`. Can be `:none`, `:full` or
38- `:incremental`. Depending on the database size, `:incremental` may be
39- beneficial.
36+ * `:auto_vacuum` - Defaults to `:none`. Can be `:none`, `:full` or `:incremental`.
37+ Depending on the database size, `:incremental` may be beneficial.
4038 * `:locking_mode` - Defaults to `:normal`. Allowed values are `:normal` or
4139 `:exclusive`. See [sqlite documentation][1] for more information.
42- * `:secure_delete` - Defaults to `:off`. Can be `:off` or `:on`. If `:on`, it will cause SQLite3
43- to overwrite records that were deleted with zeros.
44- * `:wal_auto_check_point` - Sets the write-ahead log auto-checkpoint
45- interval. Default is `1000`. Setting the auto-checkpoint size to zero or a
46- negative value turns auto-checkpointing off.
40+ * `:secure_delete` - Defaults to `:off`. Can be `:off` or `:on`. If `:on`, it will
41+ cause SQLite3 to overwrite records that were deleted with zeros.
42+ * `:wal_auto_check_point` - Sets the write-ahead log auto-checkpoint interval.
43+ Default is `1000`. Setting the auto-checkpoint size to zero or a negative value
44+ turns auto-checkpointing off.
4745 * `:busy_timeout` - Sets the busy timeout in milliseconds for a connection.
4846 Default is `2000`.
4947 * `:pool_size` - the size of the connection pool. Defaults to `5`.
50- * `:binary_id_type` - Defaults to `:string`. Determines how binary IDs are stored in the database and the type of
51- `:binary_id` columns. See the [section on binary ID types](#module-binary-id-types) for more details.
52- * `:uuid_type` - Defaults to `:string`. Determines the type of `:uuid` columns. Possible values and
53- column types are the same as for [binary IDs](#module-binary-id-types).
54- * `:datetime_type` - Defaults to `:iso8601`. Determines how datetime fields are stored in the database.
55- The allowed values are `:iso8601` and `:text_datetime`. `:iso8601` corresponds to a string of the form
56- `YYYY-MM-DDThh:mm:ss` and `:text_datetime` corresponds to a string of the form `YYYY-MM-DD hh:mm:ss`
57- * `:load_extensions` - list of paths identifying extensions to load. Defaults to []. The provided list will
58- be merged with the global extensions list, set on :exqlite, :load_extensions. Be aware that the path should
59- handle pointing to a library compiled for the current architecture. See `Exqlite.Connection.connect/1` for more.
48+ * `:binary_id_type` - Defaults to `:string`. Determines how binary IDs are stored in
49+ the database and the type of `:binary_id` columns. See the
50+ [section on binary ID types](#module-binary-id-types) for more details.
51+ * `:uuid_type` - Defaults to `:string`. Determines the type of `:uuid` columns.
52+ Possible values and column types are the same as for
53+ [binary IDs](#module-binary-id-types).
54+ * `:datetime_type` - Defaults to `:iso8601`. Determines how datetime fields are
55+ stored in the database. The allowed values are `:iso8601` and `:text_datetime`.
56+ `:iso8601` corresponds to a string of the form `YYYY-MM-DDThh:mm:ss` and
57+ `:text_datetime` corresponds to a string of the form `YYYY-MM-DD hh:mm:ss`
58+ * `:load_extensions` - list of paths identifying extensions to load. Defaults to `[]`.
59+ The provided list will be merged with the global extensions list, set on
60+ `:exqlite, :load_extensions`. Be aware that the path should handle pointing to a
61+ library compiled for the current architecture. See `Exqlite.Connection.connect/1`
62+ for more.
6063
6164 For more information about the options above, see [sqlite documentation][1]
6265
6366 ### Differences between SQLite and Ecto SQLite defaults
6467
6568 For the most part, the defaults we provide above match the defaults that SQLite usually
66- ships with. However, SQLite has conservative defaults due to its need to be strictly backwards
67- compatible, so some of them do not necessarily match "best practices". Below are the defaults
68- we provide above that differ from the normal SQLite defaults, along with rationale.
69+ ships with. However, SQLite has conservative defaults due to its need to be strictly
70+ backwards compatible, so some of them do not necessarily match "best practices". Below
71+ are the defaults we provide above that differ from the normal SQLite defaults, along
72+ with rationale.
6973
7074 * `:journal_mode` - we use `:wal`, as it is vastly superior
7175 for concurrent access. SQLite usually defaults to `:delete`.
@@ -87,16 +91,18 @@ defmodule Ecto.Adapters.SQLite3 do
8791
8892 ### Binary ID types
8993
90- The `:binary_id_type` configuration option allows configuring how `:binary_id` fields are stored in the database as
91- well as the type of the column in which these IDs will be stored. The possible values are:
94+ The `:binary_id_type` configuration option allows configuring how `:binary_id` fields
95+ are stored in the database as well as the type of the column in which these IDs will
96+ be stored. The possible values are:
9297 * `:string` (default): IDs are stored as strings, and the type of the column is `TEXT`.
9398 * `:binary`: IDs are stored in their raw binary form, and the type of the column is `BLOB`.
9499
95100 The main differences between the two formats are as follows:
96- * When stored as binary, UUIDs require much less space in the database. IDs stored as strings require 36 bytes each,
97- while IDs stored as binary only require 16 bytes.
98- * Because SQLite does not have a dedicated UUID type, most clients cannot represent UUIDs stored as binary in a human
99- readable format. Therefore, IDs stored as strings may be easier to work with if manual manipulation is required.
101+ * When stored as binary, UUIDs require much less space in the database. IDs stored as
102+ strings require 36 bytes each, while IDs stored as binary only require 16 bytes.
103+ * Because SQLite does not have a dedicated UUID type, most clients cannot represent
104+ UUIDs stored as binary in a human readable format. Therefore, IDs stored as strings
105+ may be easier to work with if manual manipulation is required.
100106
101107 ## Limitations and caveats
102108
@@ -116,24 +122,24 @@ defmodule Ecto.Adapters.SQLite3 do
116122 ### Async Sandbox testing
117123
118124 The Ecto SQLite3 adapter does not support async tests when used with
119- `Ecto.Adapters.SQL.Sandbox`. This is due to SQLite only allowing up one
120- write transaction at a time, which often does not work with the Sandbox approach of
121- wrapping each test in a transaction.
125+ `Ecto.Adapters.SQL.Sandbox`. This is due to SQLite only allowing up one write
126+ transaction at a time, which often does not work with the Sandbox approach of wrapping
127+ each test in a transaction.
122128
123129 ### LIKE match on BLOB columns
124130
125- We have the DSQLITE_LIKE_DOESNT_MATCH_BLOBS compile-time option set to true,
126- as [recommended][3] by SQLite. This means you cannot do LIKE queries on BLOB columns.
131+ We have the DSQLITE_LIKE_DOESNT_MATCH_BLOBS compile-time option set to true, as
132+ [recommended][3] by SQLite. This means you cannot do LIKE queries on BLOB columns.
127133
128134 ### Case sensitivity
129135
130136 Case sensitivity for `LIKE` is off by default, and controlled by the `:case_sensitive_like`
131137 option outlined above.
132138
133139 However, for equality comparison, case sensitivity is always _on_.
134- If you want to make a column not be case sensitive, for email storage for example, you can
135- make it case insensitive by using the [`COLLATE NOCASE`][6] option in SQLite. This is configured
136- via the `:collate` option.
140+ If you want to make a column not be case sensitive, for email storage for example, you
141+ can make it case insensitive by using the [`COLLATE NOCASE`][6] option in SQLite. This
142+ is configured via the `:collate` option.
137143
138144 So instead of:
139145
@@ -145,33 +151,40 @@ defmodule Ecto.Adapters.SQLite3 do
145151
146152 ### Check constraints
147153
148- SQLite3 supports specifying check constraints on the table or on the column definition. We currently only
149- support adding a check constraint via a column definition, since the table definition approach only
150- works at table-creation time and cannot be added at table-alter time. You can see more information in
151- the SQLite3 [CREATE TABLE documentation](https://sqlite.org/lang_createtable.html).
154+ SQLite3 supports specifying check constraints on the table or on the column definition.
155+ We currently only support adding a check constraint via a column definition, since the
156+ table definition approach only works at table-creation time and cannot be added at
157+ table-alter time. You can see more information in the SQLite3
158+ [CREATE TABLE documentation](https://sqlite.org/lang_createtable.html).
152159
153- Because of this, you cannot add a constraint via the normal `Ecto.Migration.constraint/3` method, as that
154- operates via ALTER TABLE ADD CONSTRAINT, and this type of ALTER TABLE operation SQLite3 does not support.
155- You can however get the full functionality by adding a constraint at the column level, specifying the name
156- and expression. Per the SQLite3 documentation, there is no _functional_ difference between a column or table constraint.
160+ Because of this, you cannot add a constraint via the normal `Ecto.Migration.constraint/3`
161+ method, as that operates via `ALTER TABLE ADD CONSTRAINT`, and this type of `ALTER TABLE`
162+ operation SQLite3 does not support. You can however get the full functionality by
163+ adding a constraint at the column level, specifying the name and expression. Per the
164+ SQLite3 documentation, there is no _functional_ difference between a column or table
165+ constraint.
157166
158167 Thus, adding a check constraint for a new column is as simple as:
159168
160169 add :email, :string, check: %{name: "test_constraint", expr: "email != 'test@example.com'"}
161170
162171 ### Handling foreign key constraints in changesets
163172
164- Unfortunately, unlike other databases, SQLite3 does not provide the precise name of the constraint violated,
165- but only the columns within that constraint (if it provides any information at all). Because of this, changeset
166- functions like `Ecto.Changeset.foreign_key_constraint/3` may not work at all.
167-
168- This is because the above functions depend on the Ecto Adapter returning the name of the violated constraint,
169- which you annotate in your changeset so that Ecto can convert the constraint violation into the correct
170- updated changeset when the constraint is hit during a `m:Ecto.Repo.update/2` or `m:Ecto.Repo.insert/2` operation.
171- Since we cannot get the name of the violated constraint back from SQLite3 at `INSERT` or `UPDATE` time,
172- there is no way to effectively use these changeset functions. This is a SQLite3 limitation.
173-
174- See [this GitHub issue](https://github.com/elixir-sqlite/ecto_sqlite3/issues/42) for more details.
173+ Unfortunately, unlike other databases, SQLite3 does not provide the precise name of
174+ the constraint violated, but only the columns within that constraint (if it provides
175+ any information at all). Because of this, changeset functions like
176+ `Ecto.Changeset.foreign_key_constraint/3` may not work at all.
177+
178+ This is because the above functions depend on the Ecto Adapter returning the name of
179+ the violated constraint, which you annotate in your changeset so that Ecto can convert
180+ the constraint violation into the correct updated changeset when the constraint is hit
181+ during a `c:Ecto.Repo.update/2` or `c:Ecto.Repo.insert/2` operation. Since we cannot
182+ get the name of the violated constraint back from SQLite3 at `INSERT` or `UPDATE`
183+ time, there is no way to effectively use these changeset functions. This is a SQLite3
184+ limitation.
185+
186+ See [this GitHub issue](https://github.com/elixir-sqlite/ecto_sqlite3/issues/42) for
187+ more details.
175188
176189 ### Schemaless queries
177190
0 commit comments