Список изменений для v3.x
Исходный кодv3.14.0 (2026-05-19)
Улучшения
- [Ecto.Adapter] Принимать параметр
counterвprepare_query/3 - [Ecto.Changeset] Добавить
Ecto.Changeset.reorder_assoc/2 - [Ecto.Query] Разрешить использовать from и joins с источником
{fragment, Schema} - [Ecto.Repo] Вызывать ошибку при передаче в функции Repo параметров ключевых слов, похожих на запросы
- [Ecto.Repo] Поддерживать
:replace_changedпри upsert для включения HOT-обновлений в PostgreSQL - [Ecto.Repo] Добавить параметр
:query_cacheдля выборочного обхода кэша запросов - [Ecto.Schema] Добавить параметр
:on_join_through_conflictдля - [Ecto.Type] Добавить
Ecto.Type.trim/2и разрешить разработчикам настраивать обрезку значений при приведении типов с помощью параметра:trim_values - [Ecto.UUID] Поддержка UUIDv7
- [mix.exs] Требуется decimal v3
- [mix ecto.create] По умолчанию задавать часовой пояс при создании баз данных
Исправления ошибок
- [Ecto.Repo] Правильно извлекать пароли с двоеточиями из URL
- [Ecto.Repo] Скрывать конфигурацию repo в отчётах о ходе SASL
- [Ecto.Repo] Пользовательские запросы предварительной загрузки с
order_byтеперь имеют приоритет над:preload_order. Параметр:preload_orderтеперь применяется только в том случае, если пользовательский запрос с сортировкой не указан.
v3.13.6 (2026-05-05)
Улучшения
- [mix.exs] Ослабить требование к decimal
v3.13.5 (2025-11-09)
Улучшения
- [Ecto.Query] Поддерживать выбор подмножества подзапроса в виде структуры
v3.13.4 (2025-10-24)
Исправления ошибок
- [Ecto.Changeset] Гарантировать обрезку пустых бинарных строк
- [Ecto.Repo] Гарантировать применение rollback к динамическим репозиториям
- [Ecto.Type] Правильно форматировать составные типы
:in
v3.13.3 (2025-09-19)
Улучшения
- [Ecto.Query] Принимать список элементов для исключения в
exclude
Исправления ошибок
- [Ecto.Query] Разрешить использовать функции с арностью 2 в качестве функций предварительной загрузки в запросах
- [Ecto.Query] Удалить предупреждение о литералах, срок поддержки которых мягко истёк
- [Ecto.Schema] Не считать пробелы и символы перевода строки пустыми значениями для бинарных типов
v3.13.2 (2025-06-24)
Исправления ошибок
- [Ecto.Query] Исправлена регрессия, из-за которой запросы с несколькими joins долго компилировались
- [Ecto.Repo] Исправлено обнаружение отсутствующего первичного ключа у ассоциаций, содержащих только записи nil
- [Ecto.Query] Исправлено раскрытие макросов в
overв выраженииorder_by
v3.13.1 (2025-06-19)
Исправления ошибок
- [Ecto.Repo] Не применять автоматически HOT-обновления при upsert с
replace. Пользователь должен сам убедиться, что они не пересекаются
v3.13.0 (2025-06-18)
Требуется Elixir v1.14+.
Улучшения
- [Ecto] Поддерживать встроенный в Elixir JSON
- [Ecto.Enum] Добавить
Ecto.Enum.cast_value/3 - [Ecto.Query] Разрешить использовать схему для типов списка
values - [Ecto.Query] Разрешить строки в
field/2 - [Ecto.Query] Добавить
identifier/1в запросы - [Ecto.Query] Добавить
constant/1в запросы - [Ecto.Query] Разрешить
exclude/2удалять окна - [Ecto.Query] Разрешить поля источника в
json_extract_path - [Ecto.Repo] Добавить пользовательский callback
Ecto.Repo.prepare_transaction/2 - [Ecto.Repo] Добавить
Ecto.Repo.all_by/3 - [Ecto.Repo] Добавить
Ecto.Repo.transact/2 - [Ecto.Repo] Разрешить HOT-обновления в запросах upsert в Postgres, удаляя дублирующиеся поля во время
replace_all_except - [Ecto.Schema] Поддерживать атрибут модуля
@schema_redact: :all_except_primary_keys
Исправления ошибок
- [Ecto.Query] Разрешить объединение при выборе карт, содержащих только значения nil
- [Ecto.Query]
map/2в запросах теперь всегда возвращает карту для joins, в том числе для left joins, что обеспечивает согласованность с источникамиfrom - [Ecto.Schema] Исправлена проблема, из-за которой Ecto мог сообщить, что ассоциация не существует, хотя она существовала
Мягкое устаревание (предупреждения не выводятся)
- [Ecto.Repo]
Ecto.Repo.transaction/2мягко устарела в пользуEcto.Repo.transact/1 - [Ecto.Query.API]
literal/1устарела в пользуidentifier/1
v3.12.6 (2025-06-11)
Исправлено устаревание для Elixir v1.19.
v3.12.5 (2024-11-28)
Исправления ошибок
- [Ecto.Query] Вызывать ошибку, если в
values/2передан пустой список - [Ecto.Query] Исправлено отображение
dynamic/2с интерполированными именованными привязками - [Ecto.Query] Планировать источники перед созданием замыкания plan_subquery
- [Ecto.Repo] Удалять изменения полей только для чтения из возвращаемой записи при вставке/обновлении
- [Ecto.Repo] Передавать параметры
:allow_staleассоциациям
v3.12.4 (2024-10-07)
Улучшения
- [Ecto.Repo] Документировать новый параметр
:pool_count
Исправления ошибок
- [Ecto.Repo] Обеспечить, чтобы
Ecto.Repo.reloadучитывалаsource
v3.12.3 (2024-09-06)
Исправления ошибок
- [Ecto.Changeset] Разрешить приводить к типу/устанавливать ассоциации внутри changeset встроенной схемы
v3.12.2 (2024-08-25)
Исправления ошибок
- [Ecto.Query] Разрешить задавать для
:prefixлюбое значение - [Ecto.Repo] Не перезаписывать параметры ssl из URL, если они уже заданы в конфигурации
v3.12.1 (2024-08-13)
Улучшения
- [Ecto.Type] Добавить
Ecto.Type.parameterized?/2
Исправления ошибок
- [Ecto.Enum] Исправлена спецификация Dialyzer
- [Ecto.Query] Удалена ошибочная проверка параметров подзапроса
v3.12.0 (2024-08-12)
Улучшения
- [Ecto.Changeset] Разрешить передавать
{message, opts}в качестве сообщения для нескольких API валидации - [Ecto.Query] Добавить guard
is_named_binding - [Ecto.Query] Теперь подзапросы поддерживаются в выражениях
distinct,group_by,order_byиwindow - [Ecto.Query] Разрешить использовать
select_mergeв большем количестве операцийinsert_allи подзапросов, объединяя distinct-поля - [Ecto.Query] Разрешить литеральные карты внутри
dynamic/2 - [Ecto.Query] Поддерживать раскрытие макросов на корневом уровне
order_by - [Ecto.Query] Поддерживать предварительную загрузку источников подзапросов в
fromиjoin - [Ecto.Query] Разрешить обновление карт с динамическими значениями в
select - [Ecto.Query] Разрешить использовать справа от
inлюбые структуры данных, реализующие протокол Enumerable - [Ecto.Repo] Поддерживать функции предварительной загрузки с арностью 2, принимающие идентификаторы и метаданные ассоциации
- [Ecto.Repo] Разрешить HOT-обновления в запросах upsert в Postgres, удаляя дублирующиеся поля во время
replace_all - [Ecto.Repo]
insert_allподдерживает запросы только с источником - [Ecto.Repo]
insert_allподдерживает запросы с синтаксисом update - [Ecto.Repo] Поддерживать
:allow_staleв операциях со структурами/changeset Repo - [Ecto.Schema] Разрешить делать поля схемы доступными только для чтения с помощью параметра
:writable - [Ecto.Schema] Добавить параметр
:defaults_to_structвembeds_one - [Ecto.Schema] Поддерживать тип
:duration, соответствующий duration в Elixir v1.17 - [Ecto.Type] Передавать ошибки пользовательского приведения внутреннего типа для
{:map, type}и{:array, type} - [Ecto.Type] Добавить
Ecto.Type.cast!/2
Исправления ошибок
- [Ecto.Query] Игнорировать префикс запроса в источниках CTE
- [Ecto.Query] Исправлена ошибка
preloadпри использовании ассоциации through в join с вложенной отдельной предварительной загрузкой запроса. Теперь цепочка ассоциаций больше не загружается предварительно, вместо этого данные загружаются непосредственно в загруженную ассоциацию through. - [Ecto.Query] Исправлено отображение, когда select содержит модификаторы
map/struct - [Ecto.Query] Отключать кэширование запросов для списков
values - [Ecto.Repo] Преобразовывать поля в их источники в
insert_all - [Ecto.Repo] Вызывать ошибку, если в
{:replace, fields}передан пустой список - [Ecto.Repo] Проверять, что
:prefix— строка/бинарное значение, в противном случае выводить предупреждение - [Ecto.Repo] Удалить зависимость от
:preload_orderMFA во время компиляции вhas_many
Изменения адаптера
-
Для выражений
distinct,group_by,order_byиwindowиспользуется новая структураEcto.Query.ByExprвместо старой структурыEcto.Query.QueryExpr
Возможные проблемы совместимости
- [Ecto.Changeset] Ассоциации внутри embeds всегда были доступны только для чтения. Теперь при попытке привести их к типу внутри changeset возникает ошибка (это изменение отменено в v3.12.3)
- [Ecto.ParameterizedType] Параметризованные типы теперь представлены внутри как
{:parameterized, {mod, state}}. Несмотря на то, что это представление является приватным, проекты могли на него полагаться и поэтому должны адаптироваться. ИспользуйтеEcto.ParameterizedType.init/2для создания экземпляров параметризованных типов. - [Ecto.Query] Удалён тип join
:array_join. Он был добавлен для поддержки Clickhouse, но больше не используется - [Ecto.Query] Проверять, что
:prefix— строка/бинарное значение (это изменение отменено в v3.12.2)
v3.11.2 (2024-03-07)
Исправления ошибок
- [Ecto.Query] Исправлена совместимость с будущей версией Elixir v1.17
- [Ecto.Repo] Не скрывать ошибки при предварительной загрузке, если родительский процесс перехватывает сигналы завершения
v3.11.1 (2023-12-07)
Улучшения
- [Ecto.Query] Разрешить передавать атрибуты модуля оператору
in
Исправления ошибок
- [Ecto.Query] Исправлена интерполяция строк и атомов в качестве ключей карты
- [Ecto.Query] Планировать подзапросы в
having - [Ecto.Query] Исправлена отложенная привязка для составных типов
v3.11.0 (2023-11-14)
Улучшения
- [Ecto.Association] Разрешить
preload_orderпринимать MFA для ассоциацийmany_to_many. Это позволяет сортировать по таблице соединения - [Ecto.Query] Добавить параметр
:operationвwith_cte/3. Это позволяет CTE выполнять обновления и удаления - [Ecto.Query] Поддерживать
splice(^...)вfragment - [Ecto.Query] Добавить
prepend_order_by/3 - [Ecto.Query] Разрешить
selected_as/1иselected_as/2принимать интерполированные имена - [Ecto.Query] Разрешить синтаксис обновления карт для значений
nilвselect - [Ecto.Query] Разрешить вставлять SQL с помощью подсказок
unsafe_fragment - [Ecto.Query] Поддерживать списки
values/2 - [Ecto.Repo] Добавить параметр
:on_preload_spawnвpreload/3 - [Ecto.Schema] Поддерживать параметр
:load_in_queryдля embeds - [Ecto.Schema] Поддерживать параметр
:returningдля delete
Исправления ошибок
- [Ecto.Association] Гарантировать передачу родительского префикса в запросы
on_delete - [Ecto.Changeset] Гарантировать обнаружение дублирующихся первичных ключей для embeds
- [Ecto.Embedded] Вызывать
ArgumentErrorпри указании автоматически генерируемого первичного ключа:id - [Ecto.Query] Гарантировать создание уникальных ключей кэша для выборок подзапросов
- [Ecto.Query] Вызывать ошибку при использовании в запросе литеральных бинарных значений/UUID, не являющихся базовыми
- [Ecto.Repo] Сбрасывать ассоциацию
belongs_to, если обновление внешнего ключа приводит к несоответствию
Изменения адаптера
- Адаптеры теперь получают
nilдля кодирования/декодирования - Адаптеры теперь получают
typeвместо{:maybe, type}в качестве первого аргументаloaders/2
Устаревшие возможности
- [Ecto.Query] Подсказки в виде ключевых слов больше не поддерживаются. Вместо них используйте
unsafe_fragmentвнутри подсказок
v3.10.3 (2023-07-07)
Улучшения
- [Ecto.Query] Разрешить динамический
field/2вtype/2
Исправления ошибок
- [Ecto.Changesets] Ограничить максимальное целое число менее чем 32 цифрами
- [Ecto.Type] Ограничить максимальное целое число менее чем 32 цифрами
v3.10.2 (2023-06-07)
Улучшения
- [Ecto.Changeset] Поддерживать функцию с арностью 3 и позицией в
cast_assocиcast_embed - [Ecto.Changeset] Добавить поддержку карт в
validate_length/3 - [Ecto.Changeset] Добавить параметр
:nulls_distinctвunsafe_validate_unique - [Ecto.Query] Поддерживать тип
array_joinдля адаптера ClickHouse - [Ecto.Query.API] Поддерживать параметризованные и пользовательские типы карт при проверке путей JSON
Исправления ошибок
- [Ecto.Repo] Учитывать родительский префикс в
Repo.aggregate - [Ecto.Query.API] Исправлена отложенная привязка в
json_extract_path
Устаревшие возможности
- Объявить MFA в
:withустаревшими
v3.10.1 (2023-04-12)
Исправления ошибок
- [Ecto.Changeset] Учитывать
sort_param, даже если параметр отношения не был передан - [Ecto.Query] Исправлена спецификация типов, чтобы избежать предупреждений Dialyzer
v3.10.0 (2023-04-10)
В этом выпуске Ecto.Changeset получил множество улучшений: такие функции, как Ecto.Changeset.changed?/2 и field_missing?/2, помогут сделать ваш код выразительнее. Улучшения обработки ассоциаций и embeds также упростят работу со сложными формами, особенно встроенными в приложения Phoenix.LiveView.
Что касается changeset, обратите внимание: в этом выпуске унифицирована обработка пустых значений в cast/4 и validate_required/3. Если раньше вы задавали :empty_values и хотите сохранить это новое поведение, возможно, потребуется обновить код следующим образом:
Ecto.Changeset.cast(changeset, params, [:field1, :field2], empty_values: ["", []])
на:
empty_values = [[]] ++ Ecto.Changeset.empty_values() Ecto.Changeset.cast(changeset, params, [:field1, :field2], empty_values: empty_values)
В запросы также добавлена поддержка LIMIT WITH TIES и материализованных CTE.
Улучшения
- [Ecto.Changeset] Добавить
get_assoc/get_embed - [Ecto.Changeset] Добавить
field_missing?/2 - [Ecto.Changeset] Добавить
changed?/2иchanged?/3с поддержкой предикатов - [Ecto.Changeset] Разрешить использовать
Regexв именах ограничений для точного сопоставления - [Ecto.Changeset] Разрешить параметру
:empty_valuesвcast/4включать функцию, которая должна возвращать true, если значение пустое - [Ecto.Changeset] По умолчанию
cast/4будет считать строки, состоящие только из пробельных символов, пустыми - [Ecto.Changeset] Добавить поддержку
:sort_paramи:drop_paramдляcast_assocиcast_embed - [Ecto.Query] Поддерживать параметр materialized в CTE
- [Ecto.Query] Поддерживать динамическое поле внутри
json_extract_path - [Ecto.Query] Поддерживать интерполированные значения для префиксов from/join
- [Ecto.Query] Поддерживать ties в выражениях limit с помощью
with_ties/3 - [Ecto.Schema] Добавить
:autogenerate_fieldsв API отражения схемы - [Ecto.ParameterizedType] Добавить необязательный callback
format/1
Исправления ошибок
- [Ecto.Changeset] Исключать первичный ключ при небезопасной проверке уникальности только для загруженных схем
- [Ecto.Changeset] Вызывать ошибку, если изменение, переданное в
validate_format/4, не является строкой - [Ecto.Query] Исправлена ошибка в
json_extract_path, из-за которой карты нельзя было вкладывать в embeds - [Ecto.Schema] Разрешить встроенным embeds перезаписывать конфликтующие псевдонимы
v3.9.6 (2023-07-07)
Улучшения
- [Ecto.Query] Разрешить динамический
field/2вtype/2
Исправления ошибок
- [Ecto.Changesets] Ограничить максимальное целое число менее чем 32 цифрами
- [Ecto.Type] Ограничить максимальное целое число менее чем 32 цифрами
v3.9.5 (2023-03-22)
Исправления ошибок
- [Ecto.Query] Переименовать тип
@opaque dynamicв@opaque dynamic_exprво избежание конфликтов с Erlang/OTP 26
v3.9.4 (2022-12-21)
Исправления ошибок
- [Ecto.Query] Исправлена регрессия с интерполированными предварительными загрузками, появившаяся в v3.9.3
v3.9.3 (2022-12-20)
Улучшения
- [Ecto] Добавить
reset_fields/2 - [Ecto.Multi] Добавить функцию
exists?/4 - [Ecto.Repo] Сохранять схему URL в конфигурации repo
- [Ecto.Query] Добавить поддержку перекрёстных латеральных joins
- [Ecto.Query] Разрешить использовать
dynamic/2для предварительной загрузки - [Ecto.Query.API] Разрешить интерполировать весь путь в
json_extract_path/2
v3.9.2 (2022-11-18)
Улучшения
- [Ecto.Query] Разрешить использовать
selected_asвнутри CTE - [Ecto.Query] Разрешить использовать
selected_asв подзапросах
Исправления ошибок
- [Ecto.Repo] Исправлена предварительная загрузка через ассоциации в
nil - [Ecto.Query] Исправлено объединение select поля
selected_asс источником
v3.9.1 (2022-10-06)
Улучшения
- [Ecto.Query] Разрешить использовать
selected_asв корнеdynamic/2 - [Ecto.Query] Разрешить использовать
selected_asсtype/2 - [Ecto.Query] Разрешить использовать
selected_asсselect_merge
Исправления ошибок
- [Ecto.Changeset] Восстановить поддержку встроенных схем в
unsafe_validate_unique/4 - [Ecto.Query] Гарантировать правильную предварительную загрузку условий
join_whereвmany_to_manyили в запросах с одним или несколькими joins
v3.9.0 (2022-09-27)
Улучшения
- [Ecto.Changeset] Добавить параметр
:force_changesвcast/4 - [Ecto.Enum] Разрешить встраивать поля enum как их значения или как выгруженные версии
- [Ecto.Query] Поддерживать
^%{field: dynamic(...)}вselectиselect_merge - [Ecto.Query] Поддерживать
%{field: subquery(...)}вselectиselect_merge - [Ecto.Query] Поддерживать псевдонимы select с помощью
selected_as/1иselected_as/2 - [Ecto.Query] Разрешить использовать
parent_as/1вtype/2 - [Ecto.Query] Добавить
with_named_binding/3 - [Ecto.Query] Разрешить использовать источники-фрагменты в запросах с ключевыми словами
- [Ecto.Repo] Поддерживать параметр запроса
idle_intervalв URL подключения - [Ecto.Repo] Записывать в журнал UUID в удобочитаемом формате, используя предварительно выгруженные параметры запроса
- [Ecto.Schema] Поддерживать предварительную загрузку ассоциаций во встроенных схемах
Исправление ошибки
- [Ecto.Changeset] Вызывать ошибку, если в
unsafe_validate_unique/4используется changeset без схемы или встроенная схема - [Ecto.Query] Учитывать тип виртуального поля в подзапросах
- [Ecto.Query] Не выбирать поля структуры, переопределённые с помощью
nil - [Ecto.Query] Исправлено отсутствие отслеживания полем
load_in_query: falseвselect_merge - [Ecto.Query] Исправлен источник поля при использовании в
json_extract_path - [Ecto.Query] Правильно создавать CTE во время компиляции
- [Ecto.Query] Правильно упорядочивать подзапросы в
dynamic - [Ecto.Repo] Исправлено количество параметров запроса
insert_allпри использовании запросов значений вместе сplaceholder - [Ecto.Repo] Вызывать ошибку, если комбинированный запрос используется в предварительной загрузке
many - [Ecto.Schema] Игнорировать незагруженные ассоциации при вставке
v3.8.4 (2022-06-04)
Улучшения
- [Ecto.Multi] Добавить функции
one/2иall/2 - [Ecto.Query] Поддерживать
literal(...)вfragment
Исправление ошибки
- [Ecto.Schema] Обеспечить правильный порядок отображения полей в Elixir v1.14+
v3.8.3 (2022-05-11)
Исправление ошибки
- [Ecto.Query] Разрешить использовать псевдонимы источников в
type/2 - [Ecto.Schema] Избежать предупреждений и ошибок «undefined behaviour/struct» во время компиляции
v3.8.2 (2022-05-05)
Исправление ошибки
- [Ecto.Adapter] Не требовать, чтобы метаданные адаптера были обычными картами
- [Ecto.Association] Учитывать
join_whereпри удаленииon_replaceтипа «многие ко многим» - [Ecto.Changeset] Проверять, что список находится в
empty_values, прежде чем выполнять вложенную валидацию
v3.8.1 (2022-04-27)
Исправление ошибки
- [Ecto.Query] Исправлена регрессия, из-за которой параметр on для join в
update_allоказывался не на своём месте
v3.8.0 (2022-04-26)
Для Ecto v3.8 требуется Elixir v1.10+.
Улучшения
- [Ecto] Добавить новую главу Embedded в вводные руководства
- [Ecto.Changeset] Разрешить задавать пользовательский
:error_keyв unique_constraint - [Ecto.Changeset] Добавить параметр
:matchво все функции ограничений - [Ecto.Query] Поддерживать динамические псевдонимы
- [Ecto.Query] Разрешить использовать
type/2с виртуальными полями - [Ecto.Query] Предлагать альтернативы для несуществующих полей в запросах
- [Ecto.Query] Поддерживать передачу запросов с подзапросами в
insert_all - [Ecto.Repo] Разрешить
stacktrace: true, чтобы трассировки стека включались в события телеметрии и журналы - [Ecto.Schema] Проверять параметры, переданные полям схемы
Исправления ошибок
- [Ecto.Changeset] Устранена регрессия:
validate_subsetперестала работать с пользовательскими типами массивов - [Ecto.Changeset] Потенциально несовместимое изменение: При приведении типов обнаруживать
empty_valuesвнутри списков. Это может привести к проблемам, если вы рассчитывали на приведение пустых значений (по умолчанию это только""). - [Ecto.Query] Обрабатывать литералы-списки атомов в
select - [Ecto.Query] Улучшить отслеживание
select_mergeвнутри подзапросов - [Ecto.Repo] Правильно обрабатывать литералы в запросах, переданных в
insert_all - [Ecto.Repo] Не отображать сохранённые данные как изменения при обновлении embed
- [Ecto.Repo] Потенциально несовместимое изменение: Вызывать ошибку, если у ассоциации нет первичного ключа и она предварительно загружается в запросе с join. Ранее в некоторых случаях это приводило к незаметному возврату неверного результата.
- [Ecto.Schema] Сохранять родительский префикс в таблицах соединения
v3.7.2 (2022-03-13)
Улучшения
- [Ecto.Schema] Добавить параметр для пропуска валидации значений по умолчанию
- [Ecto.Query] Разрешить coalesce в
type/2 - [Ecto.Query] Поддерживать параметризованные типы в type/2
- [Ecto.Query] Разрешить произвольные скобки в выражениях запросов
v3.7.1 (2021-08-27)
Улучшения
- [Ecto.Embedded] Сделать
Ecto.Embeddedпубличной и описать поля структуры
Исправления ошибок
- [Ecto.Repo] Убедиться, что родительский changeset включён в изменения для
insert/update/delete, если при обработке самого родителя возникли ошибки
v3.7.0 (2021-08-19)
Улучшения
- [Ecto.Changeset] Добавлена поддержка
Ecto.Changeset.traverse_validations/2 - [Ecto.Enum] Добавлены
Ecto.Enum.mappings/2иEcto.Enum.dump_values/2 - [Ecto.Query] Добавлена поддержка динамических
as(^as)иparent_as(^as) - [Ecto.Repo] Добавлен changeset с устаревшими данными в поля
Ecto.StaleEntryError - [Ecto.Schema] Добавлена поддержка
@schema_contextдля задания метаданных контекста при определении схемы
Исправления ошибок
- [Ecto.Changeset] Исправлена проблема, из-за которой при инспектировании changeset не скрывались данные во встроенных структурах
- [Ecto.Changeset] Для
validate_inclusion,validate_exclusionиvalidate_subsetиспользуется семантическое сравнение - [Ecto.Enum] При дублировании значений в
Ecto.Enumгенерируется исключение - [Ecto.Query] Гарантировано включение
hintsв кэш запросов - [Ecto.Repo] Добавлена поддержка заполнителей в
insert_allбез схем - [Ecto.Repo] Если запрос, переданный в
Repo.aggregate, содержит комбинацию, он оборачивается в подзапрос - [Ecto.Repo] Исправлена проблема, из-за которой подзапросы CTE не находили родительские привязки
- [Ecto.Repo] Возвращается changeset с ассоциациями, если какая-либо из них недействительна
v3.6.2 (2021-05-28)
Улучшения
- [Ecto.Query] Добавлена поддержка макросов в
with_cte - [Ecto.Repo] Добавлен метод
Ecto.Repo.all_running/0для просмотра всех работающих репозиториев
Исправления ошибок
- [Ecto.Query] Поля со значением nil больше не пропускаются при выборе в подзапросе
- [Ecto.Query]
parent_asможет искать псевдоним по всей цепочке родительских подзапросов - [Ecto.Query] Генерируется исключение, если в запрос передано значение nil из параметра вложенной карты
- [Ecto.Query] Исправлена проблема с
insert_allпри одновременном использовании:on_conflictи:placeholders - [mix ecto.load]
--forceбольше не передаётся базовой задаче компиляции
v3.6.1 (2021-04-12)
Улучшения
- [Ecto.Changeset] В
unsafe_validate_uniqueразрешена опция:query
Исправления ошибок
- [Ecto.Changeset] В
apply_changesдобавляется идентификатор отношения, если ключ отношения существует (вместо жёстко заданного значенияid)
v3.6.0 (2021-04-03)
Улучшения
- [Ecto.Changeset] Добавлена поддержка
:repo_optsвunsafe_validate_unique - [Ecto.Changeset] При попытке привести встроенную структуру или ассоциацию с кардинальностью один к чему-либо, кроме карты или списка ключевых слов, добавляется ошибка валидации
- [Ecto.Enum] Перечисления можно сопоставлять с пользовательскими значениями
- [Ecto.Multi] Добавлен
Ecto.Multi.put/3для непосредственного сохранения значений - [Ecto.Query] Возможно, несовместимое изменение: оптимизированы запросы
many_to_many, поэтому в большем числе случаев промежуточные таблицы больше не загружаются. Это может вызвать проблемы, если вы используетеEcto.assoc/2для загрузки ассоциацийmany_to_many, а затем пытаетесь получить доступ к промежуточным привязкам (это не рекомендуется, но раньше было возможно) - [Ecto.Repo]
insert_allможно вызывать с запросом вместо строк - [Ecto.Repo] В
insert_allдобавлена поддержка:placeholders, чтобы избежать многократной отправки одного и того же значения - [Ecto.Schema] Добавлена поддержка
:preload_orderдля ассоциацийhas_manyиmany_to_many - [Ecto.UUID] Добавлены методы преобразования UUID с суффиксом bang
- [Ecto.Query] Теперь опция
:hintsпринимает динамические значения, если они переданы в виде кортежей - [Ecto.Query] Добавлена поддержка
select: map(source, fields), гдеsourceявляется фрагментом - [Ecto.Query] Разрешено ссылаться на родительский запрос в выборе подзапроса соединения через
parent_as - [mix ecto] Добавлена поддержка подстановки файла и строки в
ECTO_EDITOR
Исправления ошибок
- [Ecto.Changeset] Изменён
apply_changes/1: отношение добавляется вstruct.relation_id, если структура отношения сохранена - [Ecto.Query] Удалён ненужный INNER JOIN из запроса ассоциации «многие ко многим»
- [Ecto.Query] Разрешена интерполяция параметрических типов в запросах
- [Ecto.Schema] Генерируется
ArgumentError, если значение по умолчанию имеет недопустимый тип
v3.5.8 (2021-02-21)
Улучшения
- [Ecto.Query] Добавлена поддержка map/2 для фрагментов и подзапросов
v3.5.7 (2021-02-07)
Исправления ошибок
- [Ecto.Query] Исправлена проблема с порядком параметров в динамических запросах с подзапросами
v3.5.6 (2021-01-20)
Улучшения
- [Ecto.Schema] Добавлена поддержка
on_replace: :delete_if_existsдля ассоциаций
Исправления ошибок
- [Ecto.Query] В выражениях запросов разрешён унарный оператор минус
- [Ecto.Schema] В типизированных картах разрешены значения nil
v3.5.5 (2020-11-12)
Улучшения
- [Ecto.Query] Добавлена поддержка операторов подзапросов:
all,anyиexists
Исправления ошибок
- [Ecto.Changeset] Для
put_assocс картами и списками ключевых слов используется источник ассоциации - [Ecto.Enum] Добавлена ветвь
castдля значений nil вEcto.Enum - [Ecto.Schema] Для невиртуальных полей разрешён вложенный тип
:any
v3.5.4 (2020-10-28)
Улучшения
- [mix ecto.drop] Добавлена поддержка
--force-dropдля баз данных, которые могут её поддерживать - [guides] Добавлено новое руководство «Мультитенантность с внешними ключами»
Исправления ошибок
- [Ecto.Changeset] Ключи в спецификациях сделаны необязательными
- [Ecto.Enum] Обеспечена работа
values/2для виртуальных полей - [Ecto.Query] Исправлено отсутствие типа в запросах CTE, выбирающих одно поле
v3.5.3 (2020-10-21)
Исправления ошибок
- [Ecto.Query] Счётчик параметров больше не сбрасывается для вложенных CTE
- [Ecto.Type] Исправлена регрессия, из-за которой массивы с nil больше нельзя было привести, загрузить или выгрузить
- [Ecto.Type] Исправлена ошибка CaseClauseError при приведении десятичного числа с двоичным остатком
v3.5.2 (2020-10-12)
Улучшения
- [Ecto.Repo] Добавлены Repo.reload/2 и Repo.reload!/2
Исправления ошибок
- [Ecto.Changeset] Исправлена ошибка «schema/1 is undefined or private» при инспектировании changeset без схемы
- [Ecto.Repo]
Ecto.Repo.default_options/1вызывается для каждой операции точки входа
v3.5.1 (2020-10-08)
Улучшения
- [Ecto.Changeset] Выводится предупреждение, если в родительской схеме есть повторяющиеся идентификаторы для
cast_assoc/3/cast_embed/3 - [Ecto.Schema]
belongs_toпринимает параметры для параметрических типов
Исправления ошибок
- [Ecto.Query] При использовании подзапроса с источником сохраняются типы полей
v3.5.0 (2020-10-03)
Для v3.5 требуется Elixir v1.8+.
Исправления ошибок
- [Ecto.Changeset] Обеспечено, что
:empty_valuesвcast/4автоматически не передаётся последующим вызовам cast. Чтобы заданный набор:empty_valuesприменялся ко всем вызовамcast/4, вместо этого измените значение, сохранённое вchangeset.empty_values - [Ecto.Changeset] Возможно, несовместимое изменение: обновления в репозитории больше не принудительно выполняются при использовании
optimistic_lock. Поле блокировки увеличивается только при наличии других изменений записи. Если изменений нет, ничего не происходит. - [Ecto.Changeset] Пустые значения больше не используются совместно автоматически в вызовах
cast/3 - [Ecto.Query] При кэшировании запросов CTE и комбинаций учитывается префикс запроса
- [Ecto.Query] Разрешено помечать запись как nil при использовании левого соединения с подзапросами
- [Ecto.Query] Добавлена поддержка подзапросов внутри динамических выражений
- [Ecto.Repo] Исправлена предварительная загрузка при использовании динамических репозиториев и песочницы в автоматическом режиме
- [Ecto.Repo] Коллекции больше не дублируются при предварительной загрузке ассоциаций для повторяющихся элементов
Улучшения
- [Ecto.Enum]
Ecto.Enumдобавлен как пользовательский параметрический тип - [Ecto.Query] Разрешено устанавливать
:prefixвfromв значение nil - [Ecto.Query] Для подзапросов в
whereбольше не ограничиваются типы картами и структурами - [Ecto.Query] В запросах разрешены атомы без интерполяции для поддержки Ecto.Enum
- [Ecto.Schema] Уникальность не проверяется, если для поля уже есть ошибка
- [Ecto.Schema] Разрешён
redact: trueвfield - [Ecto.Schema] Добавлена поддержка параметрических типов через
Ecto.ParameterizedType - [Ecto.Schema] Встроенные структуры и ассоциации переписаны как параметрические типы. Это означает, что
__schema__(:type, assoc_or_embed)теперь возвращает параметрический тип. Чтобы проверить, является ли что-либо ассоциацией, используйте вместо этого__schema__(:assocs)или__schema__(:embeds)
v3.4.6 (2020-08-07)
Улучшения
- [Ecto.Query] Разрешён
count/0дляtype/2 - [Ecto.Multi] Добавлена поддержка анонимных функций в множественных функциях
Исправления ошибок
- [Ecto.Query] В объединениях, подзапросах, CTE и т. д. логические значения учитываются как литералы
- [Ecto.Schema] Для вложенных встроенных структур генерируются идентификаторы
v3.4.5 (2020-06-14)
Улучшения
- [Ecto.Changeset] В
unsafe_validate_uniqueразрешён пользовательский ключ ошибки - [Ecto.Changeset] Повышена производительность при приведении больших карт параметров
Исправления ошибок
- [Ecto.Changeset] Улучшено сообщение об ошибке для недопустимого
cast_assoc - [Ecto.Query] Исправлена инспекция запроса с CTE-фрагментом
- [Ecto.Query] Исправлена инспекция динамических выражений с привязками-псевдонимами
- [Ecto.Query] Улучшено сообщение об ошибке при выборе одного атома
- [Ecto.Repo] Сокращено копирование данных при предварительной загрузке нескольких ассоциаций
- [Ecto.Schema] Для схемы в
:join_throughбольше не определяется зависимость времени компиляции
v3.4.4 (2020-05-11)
Улучшения
- [Ecto.Schema] В
many_to_manyдобавлена поддержкаjoin_where
v3.4.3 (2020-04-27)
Улучшения
- [Ecto.Query] Добавлена поддержка
as/1иparent_as/1для отложенных именованных привязок и ссылок на родительский запрос из подзапросов - [Ecto.Query] Добавлена поддержка
x in subquery(query)
Исправления ошибок
- [Ecto.Query] Отсутствующие ассоциации не вызывают исключение, если при предварительной загрузке указано :force
- [Ecto.Repo] При недопустимом changeset из
prepare_changesetвозвращается ошибка изRepo.delete
v3.4.2 (2020-04-10)
Улучшения
- [Ecto.Changeset] В
unique_constraint/3добавлена поддержка нескольких полей
v3.4.1 (2020-04-08)
Улучшения
- [Ecto] Добавлены
Ecto.embedded_load/3иEcto.embedded_dump/2 - [Ecto.Query] Улучшено сообщение об ошибке для недопустимых выражений JSON
- [Ecto.Repo] При инициализации Repo генерируется событие телеметрии
[:ecto, :repo, :init]
Исправления ошибок
- [Ecto.Query] Для
type/2больше не поддерживаются селекторы JSON
Устаревшие возможности
- [Ecto.Repo]
conflict_target: {:constraint, _}объявлен устаревшим. Такой подход не рекомендуется; если он действительно кому-то нужен, по-прежнему доступен{:unsafe_fragment, _}
v3.4.0 (2020-03-24)
Для v3.4 требуется Elixir v1.7+.
Улучшения
- [Ecto.Query] Разрешены динамические запросы в CTE и улучшено сообщение об ошибке
- [Ecto.Query] Добавлен
Ecto.Query.API.json_extract_path/2и добавлена поддержка путей JSON в синтаксис запросов. Например,posts.metadata["tags"][0]["name"]вернёт имя первого тега, сохранённого в поле метаданных:map - [Ecto.Repo] В репозиторий добавлен новый callback
default_options/1 - [Ecto.Repo] Добавлена поддержка передачи
:telemetry_optionsоперациям репозитория
Исправления ошибок
- [Ecto.Changeset] Корректно добавляется аннотация валидации в
validate_acceptance - [Ecto.Query] При предварительной загрузке генерируется исключение, если загружены непустые данные ассоциации без связанного ключа. Обычно это означает, что в запросе загружены не все поля
- [Ecto.Schema] Выводится понятное сообщение об ошибке, если
schemaвызывается дважды вEcto.Schema
v3.3.4 (2020-02-27)
Исправления ошибок
- [mix ecto] При разборе репозиториев больше не зависит от порядка элементов в карте
- [mix ecto.gen.repo] Улучшено сообщение об ошибке, если репозиторий не указан
v3.3.3 (2020-02-14)
Улучшения
- [Ecto.Query] Добавлена поддержка фрагментов в
lock - [Ecto.Query]
nilвselect_mergeобрабатывается аналогично базам данных SQL (то есть возвращает само значениеnil)
v3.3.2 (2020-01-28)
Улучшения
- [Ecto.Changeset] Оптимистическая блокировка увеличивается только в случае успеха
- [Ecto.Query] В выражениях окон Ecto разрешены макросы
- [Ecto.Schema] Добавлена поддержка
:join_defaultsдля ассоциацийmany_to_many - [Ecto.Schema] Для ассоциации
:defaultsможно передать MFargs - [Ecto.Type] Добавлены
Ecto.Type.embedded_loadиEcto.Type.embedded_dump
Исправления ошибок
- [Ecto.Repo] Пустое имя хоста игнорируется при разборе URL базы данных (поддержка Elixir v1.10)
- [Ecto.Repo] Комбинации переписываются в запросах Repo.exists?
- [Ecto.Schema] Учитывается дочерний
@schema_prefixвcast_assoc - [mix ecto.gen.repo] При записи новой конфигурации в
mix ecto.gen.repoиспользуетсяconfig_path
v3.3.1 (2019-12-27)
Улучшения
- [Ecto.Query.WindowAPI] Добавлена поддержка
filter/2
Исправления ошибок
- [Ecto.Query.API] Исправлено использование
coalesce/2со значениями разных типов
v3.3.0 (2019-12-11)
Улучшения
- [Ecto.Adapter] В поведение
Ecto.Adapters.Storageдобавлен callbackstorage_status/1 - [Ecto.Changeset] Добавлен
Ecto.Changeset.apply_action!/2 - [Ecto.Changeset] В
Ecto.Changeset.apply_action/2снято ограничение на действия - [Ecto.Repo] Добавлен
c:Ecto.Repo.aggregate/2 - [Ecto.Repo] Добавлена поддержка
{:replace_all_except, fields}в:on_conflict
Исправления ошибок
- [Ecto.Query] Опция
:prefixв:from/:joinтакже применяется к подзапросам - [Ecto.Query] Опция
:prefixв:joinтакже применяется к запросам - [Ecto.Query] Для литералов используются значения, возвращённые базой данных. В предыдущих версиях Ecto учитывалось, что литералы в запросах не должны отбрасываться при комбинациях, однако даже если они не отбрасывались, возвращённые базой данных значения игнорировались
- [Ecto.Repo] Операции со схемами больше не оборачиваются в транзакцию, если уже выполняются внутри транзакции. Также удалена опция private под названием
:skip_transaction
Устаревшие возможности
- [Ecto.Repo]
:replace_all_except_primary_keysобъявлен устаревшим; вместо него в:on_conflictследует использовать{:replace_all_except, fields}
v3.2.5 (2019-11-03)
Исправления ошибок
- [Ecto.Query] Исправлена ошибка, из-за которой выполнение некоторых запросов приводило к утечке типа
{:maybe, ...}
v3.2.4 (2019-11-02)
Исправления ошибок
- [Ecto.Query] Улучшено сообщение об ошибке для недопустимой привязки соединения
- [Ecto.Query] Опция
:prefixв:joinтакже применяется к ассоциациям through - [Ecto.Query] При загрузке агрегатов из базы данных вызывается пользовательский тип (если приведение не удаётся, используется значение из базы данных)
- [mix ecto.gen.repo] Добавлена поддержка конфигураций в стиле Elixir v1.9
v3.2.3 (2019-10-17)
Исправления ошибок
- [Ecto.Changeset] Перечисления, переданные в
validate_inclusion, больше не преобразуются в список
Улучшения
- [Ecto.Changeset] Улучшено сообщение об ошибке для ключей, не являющихся атомами, в change/put_change
- [Ecto.Changeset] В
cast_association/cast_embedпараметр :with можно передать в виде кортежа{module, function, args} - [Ecto.Changeset] Добавлены
fetch_change!/2иfetch_field!/2
v3.2.2 (2019-10-01)
Исправления ошибок
- [Ecto.Query] Исправлена передача аргументов в виде списка ключевых слов в
:on, если привязка не указана для join - [Ecto.Repo] Обеспечена загрузка предварительной загрузки для уже предварительно загруженной ассоциации has_many :through
v3.2.1 (2019-09-17)
Улучшения
- [Ecto.Changeset] Добавлена логика циклического перехода для инкрементатора по умолчанию в
optimistic_lock - [Ecto.Query] Макросы также раскрываются при использовании внутри
type/2
Исправления ошибок
- [Ecto.Query] Обеспечено, что запросы с некэшируемыми запросами в CTE/комбинациях также не кэшируются
v3.2.0 (2019-09-07)
Для v3.2 требуется Elixir v1.6+.
Улучшения
- [Ecto.Query] Добавлена поддержка общих табличных выражений
with_cte/3иrecursive_ctes/2 - [Ecto.Query]
dynamic/3можно использовать вorder_by,distinct,group_by, а также вpartition_by,order_byиframeвнутриwindows - [Ecto.Query] В выражениях
type/2разрешены фильтры - [Ecto.Repo] Параметры репозитория объединяются с
repo_optschangeset и записываются обратно, чтобы оставаться доступными на следующих этапах цепочки - [Ecto.Repo] Добавлен callback
prepare_query/3, вызываемый перед операциями с запросами - [Ecto.Repo] Добавлена поддержка опции
:returningвEcto.Repo.update/2 - [Ecto.Repo] В
Ecto.Repo.transaction/2можно передать функцию с одним аргументом, которым является текущий репозиторий - [Ecto.Type] В
Ecto.Typeдобавлен новый callbackembed_as/1, позволяющий адаптерам управлять поведением встраивания - [Ecto.Type] Добавлен
use Ecto.Type, реализующий новые обязательные callbacks для удобства использования
Исправления ошибок
- [Ecto.Association] Перед вставкой при замене в
has_oneобеспечено удаление ассоциации - [Ecto.Query] При построении запроса интерполированные
nilбольше не допускаются в литеральном списке ключевых слов - [Ecto.Query] Литералы больше не удаляются из комбинаций, иначе запросы UNION/INTERSECTION могут не совпасть по числу значений в
select - [Ecto.Query] Во время компиляции больше не предпринимается попытка объединить списки, не являющиеся списками ключевых слов, переданные в
select_merge - [Ecto.Repo] Ассоциации
:throughпри предварительной загрузке больше не перезаписываются, если не задано принудительное выполнение - [Ecto.Repo] Обеспечено распространение опции prefix на комбинации и рекурсивные запросы
- [Ecto.Schema] Для генерации временных меток используется системное время без дрейфа
- [Ecto.Type] В
datetime_addразрешены любые значения datetime
v3.1.7 (2019-06-27)
Исправления ошибок
- [Ecto.Changeset] Обеспечено распространение
put_assocс пустым changeset при вставке
v3.1.6 (2019-06-19)
Улучшения
- [Ecto.Repo] Добавлены
:read_onlyрепозитории - [Ecto.Schema] Также проверяются параметры, переданные ассоциациям
:through
Исправления ошибок
- [Ecto.Changeset]
put_assocиз[]в[]или изnilвnilбольше не помечается как изменение - [Ecto.Query] При исключении соединений удаляется именованная привязка
- [mix ecto.gen.repo] Вместо жёстко заданного значения
config/config.exsиспользуется:config_path
v3.1.5 (2019-06-06)
Улучшения
- [Ecto.Repo] Для
use Ecto.Repoразрешена опция:default_dynamic_repo - [Ecto.Schema] В опции
:whereдля ассоциаций добавлена поддержка{:fragment, ...}
Исправления ошибок
- [Ecto.Query] Исправлена обработка литералов в комбинирующих операторах (union, except, intersection)
v3.1.4 (2019-05-07)
Исправления ошибок
- [Ecto.Changeset] Перед добавлением перечислений валидации в метаданные валидации они преобразуются в списки
- [Ecto.Schema] Префикс корректно распространяется на источник join_through в ассоциациях many_to_many
v3.1.3 (2019-04-30)
Улучшения
- [Ecto.Changeset] В ошибках проверок на основе перечислений теперь указывается перечисление, по которому выполнялась проверка
v3.1.2 (2019-04-24)
Улучшения
- [Ecto.Query] Добавлена поддержка
type+over - [Ecto.Schema] Поля схемы можно исключать из запросов
Исправления ошибок
- [Ecto.Changeset] Поле больше не указывается как изменённое, если ему присвоено исходное значение
- [Ecto.Query] Литеральные числа и битовые строки сохраняются в подзапросах и объединениях
- [Ecto.Query] Улучшено сообщение об ошибке для недопустимого выражения
type/2 - [Ecto.Query] Корректно подсчитывается интерполяция в
select_merge/2
v3.1.1 (2019-04-04)
Исправления ошибок
- [Ecto] Jason не является обязательной зависимостью и остаётся необязательным
- [Ecto.Repo] Обеспечена работа
many_to_manyиEcto.Multiс динамическими репозиториями
v3.1.0 (2019-04-02)
Для v3.1 требуется Elixir v1.5+.
Улучшения
- [Ecto.Changeset] Для
validate_numberдобавлена опцияnot_equal_to - [Ecto.Query] Улучшено сообщение об ошибке для отсутствующих аргументов
fragment - [Ecto.Query] Улучшено сообщение об ошибке при отсутствии ключа структуры для структур, созданных в
select - [Ecto.Query] Разрешены динамические именованные привязки
- [Ecto.Repo] Добавлена экспериментальная поддержка динамических репозиториев с помощью
Ecto.Repo.put_dynamic_repo/1иEcto.Repo.get_dynamic_repo/0 - [Ecto.Type] Строки naive_datetime/utc_datetime без секунд приводятся к соответствующему типу
Исправления ошибок
- [Ecto.Changeset] Не выполнять запрос
unsafe_validate_unique, если соответствующие поля не изменились - [Ecto.Changeset] Выдавать ошибку, если в
Ecto.Changeset.change/2передано неизвестное поле - [Ecto.Changeset] Добавить в ошибки, созданные
validate_length/3, информацию о типе, который прошел проверку - [Ecto.Query] Добавить поддержку
field/2в качестве первого элементаtype/2и псевдонима в качестве второго элементаtype/2 - [Ecto.Query] Не пытаться проверять типы привязок с именами, которые неизвестны во время компиляции
- [Ecto.Query] Корректно приводить к типу логические выражения в select
- [Mix.Ecto] Загружать приложения во время поиска репозитория, чтобы была доступна среда приложения
Устаревшие возможности
- [Ecto.LogEntry] Полностью объявить устаревшим API, ранее объявленный устаревшим в мягком режиме
v3.0.7 (2019-02-06)
Исправления ошибок
- [Ecto.Query]
reverse_orderсортирует в обратном порядке по первичному ключу, если порядок не задан
v3.0.6 (2018-12-31)
Улучшения
- [Ecto.Query] Добавить
reverse_order/1
Исправления ошибок
- [Ecto.Multi] Выдавать более понятное сообщение об ошибке при случайном откате внутри
Ecto.Multi - [Ecto.Query] Корректно объединять глубоко вложенные предварительно загруженные соединения
- [Ecto.Query] Выдавать более понятное сообщение об ошибке, если в запросах без схемы отсутствует select
- [Ecto.Schema] Исправить порядок параметров в assoc
:where
v3.0.5 (2018-12-08)
Несовместимые изменения
- [Ecto.Schema] У параметра
:where, добавленного в Ecto 3.0.0, был существенный недостаток, поэтому в этой версии он переработан. Это означает, что:whereбольше нельзя передать кортеж из трех элементов; вместо этого необходимо передать список ключевых слов. Дополнительную информацию см. в разделе «Фильтрация ассоциаций» документацииhas_many/3
Исправления ошибок
- [Ecto.Query] Не выдавать ошибку для списков кортежей, не являющихся списками ключевых слов. Вместо этого позволить пользовательскому Ecto.Type обрабатывать их
- [Ecto.Query] Разрешить передавать
prefix: nilподзапросам - [Ecto.Query] Использовать разные ключи кэша для объединений, пересечений и разностей
- [Ecto.Repo] Исправить поддержку upsert с
:replaceбез схемы - [Ecto.Type] Не терять точность при приведении
utc_datetime_usecс часовым поясом, отличным от Etc/UTC
v3.0.4 (2018-11-29)
Улучшения
- [Decimal] Обновить зависимость decimal
- [Ecto.Repo] Удалить неиспользуемый
:pool_timeout
v3.0.3 (2018-11-20)
Улучшения
- [Ecto.Changeset] Добавить параметр
count: :bytesвvalidate_length/3 - [Ecto.Query] Поддержать передачу
Ecto.QueryвEcto.Repo.insert_all
Исправления ошибок
- [Ecto.Type] Учитывать типы адаптера при загрузке и выгрузке массивов и отображений
- [Ecto.Query] Убедиться, что в order_by нет привязок при использовании комбинаций в
Ecto.Query - [Ecto.Repo] Убедиться, что адаптер скомпилирован (а не только загружен) перед его вызовом
- [Ecto.Repo] Поддержать новый формат спецификации дочернего процесса от адаптеров
v3.0.2 (2018-11-17)
Исправления ошибок
- [Ecto.LogEntry] Восстановить старые API Ecto.LogEntry для совместимости
- [Ecto.Repo] Учитывать поля без соединений при объединении предварительно загруженных ассоциаций только на корневом уровне
- [Ecto.Repo] Учитывать источники полей в параметре upsert :replace_all_fields
- [Ecto.Type] Преобразовывать
:utc_datetimeвDateTimeпри передаче адаптерам
v3.0.1 (2018-11-03)
Исправления ошибок
- [Ecto.Query] Сохранять порядок параметров при использовании более 32 параметров
- [Ecto.Query] Учитывать префикс запроса при планировании соединений ассоциаций
- [Ecto.Repo] Учитывать поля без соединений как уникальные параметры при объединении предварительно загруженных ассоциаций запроса
v3.0.0 (2018-10-29)
Обратите внимание: эта версия включает изменения из ecto и ecto_sql, однако в будущих выпусках все записи ecto_sql будут перечислены в отдельных журналах изменений.
Улучшения
- [Ecto.Adapters.MySQL] Добавить возможность указывать cli_protocol для команд
ecto.createиecto.drop - [Ecto.Adapters.PostgreSQL] Добавить возможность указывать имя базы данных обслуживания для адаптера PostgreSQL для команд
ecto.createиecto.drop - [Ecto.Changeset] Сохранять имя ограничения в метаданных ошибок для ограничений
- [Ecto.Changeset] Добавить
validations/1иconstraints/1вместо разрешения прямого доступа к полям структуры - [Ecto.Changeset] Добавить параметр
:force_updateпри приведении отношений, чтобы принудительно выполнять обновление, даже если изменений нет - [Ecto.Migration] Теперь миграции блокируют таблицу миграций, чтобы избежать параллельного выполнения миграций в кластере. Тип блокировки можно настроить с помощью конфигурации репозитория
:migration_lock; по умолчанию используется «FOR UPDATE», а значение nil отключает блокировку - [Ecto.Migration] Добавить конфигурацию репозитория
:migration_default_prefix - [Ecto.Migration] Добавить обратимую версию подкоманды
remove/2 - [Ecto.Migration] Добавить поддержку непустых массивов в качестве значений по умолчанию в миграциях
- [Ecto.Migration] Добавить поддержку журналирования уведомлений, сигналов и предупреждений при выполнении миграций (на данный момент поддерживается только Postgres)
- [Ecto.Migrator] Выдавать предупреждение при запуске миграции, если в базе данных уже применена более поздняя версия
- [Ecto.Multi] Добавить поддержку анонимных функций в
insert/4,update/4,insert_or_update/4иdelete/4 - [Ecto.Query] Поддержать кортежи в
whereиhaving, что позволяет создавать запросы, напримерwhere: {p.foo, p.bar} > {^foo, ^bar} - [Ecto.Query] Поддержать арифметические операторы в запросах как тонкий слой над функциональностью БД
- [Ecto.Query] Разрешить задавать имена соединениям в запросах с помощью
:asи использовать именованные привязки - [Ecto.Query] Поддержать исключение определенных типов соединений в
exclude/2 - [Ecto.Query] Разрешить обновление виртуальных полей в подзапросах
- [Ecto.Query] Поддержать
coalesce/2в запросах, напримерselect: coalesce(p.title, p.old_title) - [Ecto.Query] Поддержать
filter/2в запросах, напримерselect: filter(count(p.id), p.public == true) - [Ecto.Query] Параметры
:prefixи:hintsтеперь поддерживаются как в выраженияхfrom, так и вjoin - [Ecto.Query] Поддержать
:asc_nulls_last,:asc_nulls_first,:desc_nulls_lastи:desc_nulls_firstвorder_by - [Ecto.Query] Разрешить передавать в запросы переменные (источники); например, это полезно для вызова функций, таких как
fragment("some_function(?)", p) - [Ecto.Query] Добавить поддержку
union,union_all,intersection,intersection_all,exceptиexcept_all - [Ecto.Query] Добавить поддержку
windowsиover - [Ecto.Query] Выдавать ошибку при сравнении строки со списком символов во время планирования
- [Ecto.Repo] Запускать транзакции только при изменении ассоциации или встраиваемого объекта, чтобы снизить накладные расходы при операциях с репозиторием
- [Ecto.Repo] Поддержать
:replace_all_except_primary_keyв качестве стратегии:on_conflict - [Ecto.Repo] Поддержать
{:replace, fields}в качестве стратегии:on_conflict - [Ecto.Repo] Поддержать
:unsafe_fragmentв качестве:conflict_target - [Ecto.Repo] Поддержать
selectв запросах, передаваемых вupdate_allиdelete_all - [Ecto.Repo] Добавить
Repo.exists?/2 - [Ecto.Repo] Добавить
Repo.checkout/2— полезно при выполнении нескольких операций за короткий промежуток времени, позволяя обходить пул - [Ecto.Repo] Добавить
:stale_error_fieldвRepo.insert/update/delete, преобразующийEcto.StaleEntryErrorв ошибку changeset. Сообщение также можно задать с помощью:stale_error_message - [Ecto.Repo] При предварительной загрузке результаты теперь сортируются только по ключу отношения, а не по всей структуре
- [Ecto.Schema] Разрешить передавать параметр
:whereвhas_many/has_one/belongs_to/many_to_many
Исправления ошибок
- [Ecto.Inspect] Не выдавать ошибку при просмотре выражений запроса, количество привязок в которых превышает число доступных привязок
- [Ecto.Migration] Сохранять двойные символы подчеркивания в автоматически сгенерированных именах индексов для единообразия с changeset
- [Ecto.Query] Исправить
Ecto.Query.API.map/2для одного столбца со значением nil при наличии соединения - [Ecto.Migration] Убедиться, что
create_if_not_existsможно корректно отменить - [Ecto.Repo] Разрешить предварительно загружать ассоциации many_to_many с помощью функции (ранее поведение было непредсказуемым)
- [Ecto.Schema] Обеспечить загрузку автоматически генерируемого ID с пользовательским типом
- [Ecto.Schema] Сделать так, чтобы
updated_atимел то же значение, что иinserted_at - [Ecto.Schema] Убедиться, что все поля заменяются на
on_conflict: :replace_all/:replace_all_except_primary_key, а не только поля, переданные как изменения - [Ecto.Type] Возвращать
:errorпри приведении NaN или бесконечных десятичных чисел - [mix ecto.migrate] Корректно выполнять миграции после изменения ECTO_EDITOR
- [mix ecto.migrations] Выводить список примененных версий, даже если файл миграции удален
- [mix ecto.load] Теперь задача завершается с ошибкой при ошибках SQL в Postgres
Устаревшие возможности
Хотя версия Ecto 3.0 является мажорным обновлением, приведенная ниже функциональность выдает предупреждения об устаревании, чтобы упростить процесс миграции. Она будет удалена в будущих выпусках Ecto 3.1 и новее.
- [Ecto.Changeset] Передача списка двоичных строк в
cast/3объявлена устаревшей; передавайте вместо этого список атомов - [Ecto.Multi]
Ecto.Multi.run/3теперь получает в качестве первого аргумента функций репозиторий, в котором выполняется транзакция, а в качестве второго — накопленные к этому моменту изменения - [Ecto.Query] Теперь
join/5ожидаетon: exprв качестве последнего аргумента вместо простоexpr. Это необходимо для корректной поддержки параметров:as,:hintsи:prefix - [Ecto.Repo] Параметр
:returningдляupdate_allиdelete_allобъявлен устаревшим, поскольку эти операторы теперь поддерживают конструкцииselect - [Ecto.Repo] Передача
:adapterчерез конфигурацию объявлена устаревшей; вместо этого передавайте его вuse Ecto.Repo - [Ecto.Repo] Конфигурация
:loggersобъявлена устаревшей и заменена на «События телеметрии»
Несовместимые изменения
- [Ecto.DateTime]
Ecto.Date,Ecto.TimeиEcto.DateTimeранее были объявлены устаревшими, а теперь удалены - [Ecto.DataType] Протокол
Ecto.DataTypeудален - [Ecto.Migration] Автоматически определяемые имена индексов в Ecto v3.0 могут отличаться для индексов со сложными именами столбцов
- [Ecto.Multi]
Ecto.Multi.run/5теперь получает в качестве первого аргумента функций репозиторий, в котором выполняется транзакция, а в качестве второго — накопленные к этому моменту изменения - [Ecto.Query]
joinбольше не заключаетfragmentв круглые скобки. В некоторых случаях, например в общих табличных выражениях, фрагмент необходимо явно заключить в скобки. - [Ecto.Repo] Параметр
on_conflict: :replace_allтеперь также отправляет в базу данных поля со значениями по умолчанию. Чтобы сохранить прежнее поведение, при котором отправлялись только изменения changeset, задайте ему значениеon_conflict: {:replace, Map.keys(changeset.changes)}(это изменение также указано как исправление ошибки) - [Ecto.Repo] Операции репозитория больше не вызываются из обратных вызовов ассоциаций. Это поведение не было гарантировано и в предыдущих версиях, но мы указываем его среди несовместимых изменений, чтобы предупредить пользователей, которые на него полагались
- [Ecto.Repo]
:pool_timeoutбольше не поддерживается; вместо него используется новая система очередей, описанная вDBConnection.start_link/2в разделе «Конфигурация очереди». Большинству пользователей достаточно настроить:timeout, поскольку теперь он включает и время в очереди, и время выполнения запроса - [Ecto.Schema]
:time,:naive_datetimeи:utc_datetimeбольше не сохраняют информацию о микросекундах. Чтобы сохранять микросекунды, используйте:time_usec,:naive_datetime_usec,:utc_datetime_usec - [Ecto.Schema] Параметр
@schema_prefixтеперь влияет только наfrom/join, где используется схема, а не на весь запрос - [Ecto.Schema.Metadata] Ключ
sourceбольше не возвращает кортеж из префикса схемы и имени таблицы или коллекции. Теперь он возвращает только строку с именем таблицы или коллекции. Префикс схемы теперь можно получить через ключprefix. - [Mix.Ecto]
Mix.Ecto.ensure_started/2удален. Однако в Ecto 2.2 модульMix.Ectoне считался частью публичного API и не должен был использоваться; мы указываем это для справки.
Изменения адаптеров
- [Ecto.Adapter] Разделить
Ecto.AdapterнаEcto.Adapter.QueryableиEcto.Adapter.Schema, чтобы предоставить более специализированные API репозитория - [Ecto.Adapter] Поле
:sourcesвquery_metaтеперь содержит кортежи из трех элементов с{source, schema, prefix}для поддержки префиксовfrom/join(#2572) - [Ecto.Adapter] Типы базы данных
time,utc_datetimeиnaive_datetimeдолжны преобразовываться в типы с точностью до секунд, а типы базы данныхtime_usec,utc_datetime_usecиnaive_datetime_usecдолжны иметь точность до микросекунд (#2291) - [Ecto.Adapter] Аргумент
on_conflictдляinsertиinsert_allбольше не получает кортеж{:replace_all, list(), atom()}. Вместо этого он получает{fields :: [atom()], list(), atom()}, гдеfields— это список атомов, обозначающих заменяемые поля (#2181) - [Ecto.Adapter]
insert/update/deleteтеперь получают поля:sourceи:prefixпо отдельности вместо одного поля:source, содержащего оба значенияsourceиprefix(#2490) - [Ecto.Adapter.Migration] Добавлен новый обратный вызов
lock_for_migration/4. По умолчанию он реализован вEcto.Adapters.SQL(#2215) - [Ecto.Adapter.Migration] Теперь
execute_ddlдолжен возвращать{:ok, []}, чтобы в будущем можно было возвращать уведомления, подсказки и предупреждения (адаптерам, использующимEcto.Adapters.SQL, ничего менять не нужно) - [Ecto.Query] Поле
fromвEcto.Queryтеперь возвращаетEcto.Query.FromExprс полем:source, унифицируя поведение в выраженияхfromиjoin(#2497) - [Ecto.Query] Теперь в запросах поддерживаются кортежные выражения. Например,
where: {p.foo, p.bar} > {p.bar, p.baz}должно преобразовываться вWHERE (p.foo, p.bar) > (p.bar, p.baz)в базах данных SQL. Адаптеры необходимо изменить, чтобы они обрабатывали{:{}, meta, exprs}в AST запроса (#2344) - [Ecto.Query] Адаптеры должны поддерживать в запросах следующие арифметические операторы:
+,-,*и/(#2400) - [Ecto.Query] Адаптеры должны поддерживать
filter/2в запросах, как вselect: filter(count(p.id), p.public == true)(#2487)
Предыдущие версии
- См. CHANGELOG.md в ветке v2.2
© 2014 Chris McCord
Licensed under the MIT License.
https://ecto.hexdocs.pm/changelog.html