201 lines
7.1 KiB
Markdown
201 lines
7.1 KiB
Markdown
|
<img width="250" src="https://github.com/elixir-ecto/ecto/raw/master/guides/images/logo.png#gh-light-mode-only" alt="Ecto">
|
|||
|
<img width="250" src="https://github.com/elixir-ecto/ecto/raw/master/guides/images/logo-white.png#gh-dark-mode-only" alt="Ecto">
|
|||
|
|
|||
|
---
|
|||
|
|
|||
|
[![Build Status](https://github.com/elixir-ecto/ecto/workflows/CI/badge.svg)](https://github.com/elixir-ecto/ecto/actions) [![Hex.pm](https://img.shields.io/hexpm/v/ecto.svg)](https://hex.pm/packages/ecto) [![Documentation](https://img.shields.io/badge/documentation-gray)](https://hexdocs.pm/ecto/)
|
|||
|
|
|||
|
## Installation
|
|||
|
|
|||
|
Add `:ecto` to the list of dependencies in `mix.exs`:
|
|||
|
|
|||
|
```elixir
|
|||
|
def deps do
|
|||
|
[
|
|||
|
{:ecto, "~> 3.10"}
|
|||
|
]
|
|||
|
end
|
|||
|
```
|
|||
|
|
|||
|
## About
|
|||
|
|
|||
|
Ecto is a toolkit for data mapping and language integrated query for Elixir. Here is an example:
|
|||
|
|
|||
|
```elixir
|
|||
|
# In your config/config.exs file
|
|||
|
config :my_app, ecto_repos: [Sample.Repo]
|
|||
|
|
|||
|
config :my_app, Sample.Repo,
|
|||
|
database: "ecto_simple",
|
|||
|
username: "postgres",
|
|||
|
password: "postgres",
|
|||
|
hostname: "localhost",
|
|||
|
port: "5432"
|
|||
|
|
|||
|
# In your application code
|
|||
|
defmodule Sample.Repo do
|
|||
|
use Ecto.Repo,
|
|||
|
otp_app: :my_app,
|
|||
|
adapter: Ecto.Adapters.Postgres
|
|||
|
end
|
|||
|
|
|||
|
defmodule Sample.Weather do
|
|||
|
use Ecto.Schema
|
|||
|
|
|||
|
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 Sample.App do
|
|||
|
import Ecto.Query
|
|||
|
alias Sample.{Weather, Repo}
|
|||
|
|
|||
|
def keyword_query do
|
|||
|
query =
|
|||
|
from w in Weather,
|
|||
|
where: w.prcp > 0 or is_nil(w.prcp),
|
|||
|
select: w
|
|||
|
|
|||
|
Repo.all(query)
|
|||
|
end
|
|||
|
|
|||
|
def pipe_query do
|
|||
|
Weather
|
|||
|
|> where(city: "Kraków")
|
|||
|
|> order_by(:temp_lo)
|
|||
|
|> limit(10)
|
|||
|
|> Repo.all
|
|||
|
end
|
|||
|
end
|
|||
|
```
|
|||
|
|
|||
|
Ecto is commonly used to interact with databases, such as PostgreSQL and MySQL via [Ecto.Adapters.SQL](https://hexdocs.pm/ecto_sql) ([source code](https://github.com/elixir-ecto/ecto_sql)). Ecto is also commonly used to map data from any source into Elixir structs, whether they are backed by a database or not.
|
|||
|
|
|||
|
See the [getting started guide](https://hexdocs.pm/ecto/getting-started.html) and the [online documentation](https://hexdocs.pm/ecto) for more information. Other resources available are:
|
|||
|
|
|||
|
* [Programming Ecto](https://pragprog.com/book/wmecto/programming-ecto), by Darin Wilson and Eric Meadows-Jönsson, which guides you from fundamentals up to advanced concepts
|
|||
|
|
|||
|
* [The Little Ecto Cookbook](https://dashbit.co/ebooks/the-little-ecto-cookbook), a free ebook by Dashbit, which is a curation of the existing Ecto guides with some extra contents
|
|||
|
|
|||
|
## Usage
|
|||
|
|
|||
|
You need to add both Ecto and the database adapter as a dependency to your `mix.exs` file. The supported databases and their adapters are:
|
|||
|
|
|||
|
| Database | Ecto Adapter | Dependencies |
|
|||
|
| :--------- | :----------------------- | :----------------------------------------------- |
|
|||
|
| PostgreSQL | Ecto.Adapters.Postgres | [ecto_sql][ecto_sql] + [postgrex][postgrex] |
|
|||
|
| MySQL | Ecto.Adapters.MyXQL | [ecto_sql][ecto_sql] + [myxql][myxql] |
|
|||
|
| MSSQL | Ecto.Adapters.Tds | [ecto_sql][ecto_sql] + [tds][tds] |
|
|||
|
| SQLite3 | Ecto.Adapters.SQLite3 | [ecto_sqlite3][ecto_sqlite3] |
|
|||
|
| ClickHouse | Ecto.Adapters.ClickHouse | [ecto_ch][ecto_ch] |
|
|||
|
| ETS | Etso | [etso][etso] |
|
|||
|
|
|||
|
[ecto_sql]: https://github.com/elixir-ecto/ecto_sql
|
|||
|
[postgrex]: https://github.com/elixir-ecto/postgrex
|
|||
|
[myxql]: https://github.com/elixir-ecto/myxql
|
|||
|
[tds]: https://github.com/livehelpnow/tds
|
|||
|
[ecto_sqlite3]: https://github.com/elixir-sqlite/ecto_sqlite3
|
|||
|
[etso]: https://github.com/evadne/etso
|
|||
|
[ecto_ch]: https://github.com/plausible/ecto_ch
|
|||
|
|
|||
|
For example, if you want to use PostgreSQL, add to your `mix.exs` file:
|
|||
|
|
|||
|
```elixir
|
|||
|
defp deps do
|
|||
|
[
|
|||
|
{:ecto_sql, "~> 3.0"},
|
|||
|
{:postgrex, ">= 0.0.0"}
|
|||
|
]
|
|||
|
end
|
|||
|
```
|
|||
|
|
|||
|
Then run `mix deps.get` in your shell to fetch the dependencies. If you want to use another database, just choose the proper dependency from the table above.
|
|||
|
|
|||
|
Finally, in the repository definition, you will need to specify the `adapter:` respective to the chosen dependency. For PostgreSQL it is:
|
|||
|
|
|||
|
```elixir
|
|||
|
defmodule MyApp.Repo do
|
|||
|
use Ecto.Repo,
|
|||
|
otp_app: :my_app,
|
|||
|
adapter: Ecto.Adapters.Postgres,
|
|||
|
...
|
|||
|
```
|
|||
|
|
|||
|
## Supported Versions
|
|||
|
|
|||
|
| Branch | Support |
|
|||
|
| ----------------- | ------------------------ |
|
|||
|
| v3.11 | Bug fixes |
|
|||
|
| v3.10 | Security patches only |
|
|||
|
| v3.9 | Security patches only |
|
|||
|
| v3.8 | Security patches only |
|
|||
|
| v3.7 | Security patches only |
|
|||
|
| v3.6 and earlier | Unsupported |
|
|||
|
|
|||
|
With version 3.0, Ecto API has become stable. Our main focus is on providing
|
|||
|
bug fixes and incremental changes.
|
|||
|
|
|||
|
## Important links
|
|||
|
|
|||
|
* [Documentation](https://hexdocs.pm/ecto)
|
|||
|
* [Mailing list](https://groups.google.com/forum/#!forum/elixir-ecto)
|
|||
|
* [Examples](https://github.com/elixir-ecto/ecto/tree/master/examples)
|
|||
|
|
|||
|
## Running tests
|
|||
|
|
|||
|
Clone the repo and fetch its dependencies:
|
|||
|
|
|||
|
$ git clone https://github.com/elixir-ecto/ecto.git
|
|||
|
$ cd ecto
|
|||
|
$ mix deps.get
|
|||
|
$ mix test
|
|||
|
|
|||
|
Note that `mix test` does not run the tests in the `integration_test` folder. To run integration tests, you can clone `ecto_sql` in a sibling directory and then run its integration tests with the `ECTO_PATH` environment variable pointing to your Ecto checkout:
|
|||
|
|
|||
|
$ cd ..
|
|||
|
$ git clone https://github.com/elixir-ecto/ecto_sql.git
|
|||
|
$ cd ecto_sql
|
|||
|
$ mix deps.get
|
|||
|
$ ECTO_PATH=../ecto mix test.all
|
|||
|
|
|||
|
### Running containerized tests
|
|||
|
|
|||
|
It is also possible to run the integration tests under a containerized environment using [earthly](https://earthly.dev/get-earthly):
|
|||
|
|
|||
|
$ earthly -P +all
|
|||
|
|
|||
|
You can also use this to interactively debug any failing integration tests using:
|
|||
|
|
|||
|
$ earthly -P -i --build-arg ELIXIR_BASE=1.8.2-erlang-21.3.8.21-alpine-3.13.1 +integration-test
|
|||
|
|
|||
|
Then once you enter the containerized shell, you can inspect the underlying databases with the respective commands:
|
|||
|
|
|||
|
PGPASSWORD=postgres psql -h 127.0.0.1 -U postgres -d postgres ecto_test
|
|||
|
MYSQL_PASSWORD=root mysql -h 127.0.0.1 -uroot -proot ecto_test
|
|||
|
sqlcmd -U sa -P 'some!Password'
|
|||
|
|
|||
|
## Logo
|
|||
|
|
|||
|
"Ecto" and the Ecto logo are Copyright (c) 2020 Dashbit.
|
|||
|
|
|||
|
The Ecto logo was designed by [Dane Wesolko](https://www.danewesolko.com).
|
|||
|
|
|||
|
## License
|
|||
|
|
|||
|
Copyright (c) 2013 Plataformatec \
|
|||
|
Copyright (c) 2020 Dashbit
|
|||
|
|
|||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|||
|
you may not use this file except in compliance with the License.
|
|||
|
You may obtain a copy of the License at [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0)
|
|||
|
|
|||
|
Unless required by applicable law or agreed to in writing, software
|
|||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|||
|
See the License for the specific language governing permissions and
|
|||
|
limitations under the License.
|