Эта страница переведена PageTurner AI (бета). Не одобрена официально проектом. Нашли ошибку? Сообщить о проблеме →
Примечания к выпуску 1.0
TypeORM 1.0 — это мажорный релиз, который удаляет давно устаревшие API, модернизирует системные требования и включает десятки исправлений ошибок и новых функций, накопленных в течение цикла версий 0.3.x.
Критические изменения
Подробные инструкции по обновлению смотрите в Руководстве по обновлению.
Системные требования
-
Требуется Node.js 20+ — поддержка Node.js 16 и 18 прекращена, минимальной целевой версией JavaScript теперь является ES2023 (#11382 от @alumni)
-
Удалён полифил
Buffer— для бинарных данных на платформах вне Node.js теперь используетсяUint8Array; Node.jsBuffer(который расширяетUint8Array) продолжает работать как прежде (#11935 от @pujux) -
Замена библиотеки glob —
globзаменён наtinyglobby, аrimrafудалён, что уменьшило количество зависимостей (#11699 от @alumni) -
Хеширование перенесено на нативный
crypto— пакетыsha.jsиuuidзаменены на нативный модульcryptoиcrypto.randomUUID()(#11864 от @G0maa, #11769 от @mag123c)
Изменения в драйверах
-
MySQL / MariaDB: пакет
mysqlудалён — поддерживается толькоmysql2; опцияconnectorPackageудалена (#11766 от @pkuczynski) -
MySQL:
legacySpatialSupportпо умолчаниюfalse— по умолчанию используются стандартные функцииST_GeomFromText/ST_AsText(#12083 от @pkuczynski) -
MySQL: удалены опции колонок
widthиzerofill— они были устаревшими в MySQL 8.0.17 и удалены в MySQL 8.4 (#12084 от @pkuczynski) -
SQLite:
sqlite3удалён,better-sqlite3по умолчанию — пакетsqlite3больше не поддерживается; опцииflagsиbusyTimeoutудалены (#11836 от @pkuczynski) -
MongoDB: требуется драйвер v7+ — поддержка драйверов MongoDB Node.js v5/v6 прекращена; метод
stats()удалён; устаревшие опции подключения удалены; внутренние типы больше не экспортируются (#12208 от @naorpeled, #12179 от @pkuczynski, #12120 от @pkuczynski, #12037 от @alumni) -
MS SQL Server: опция подключения
domainудалена — используйтеauthenticationс типом NTLM вместо этого (#12135 от @pkuczynski) -
MS SQL Server:
options.isolationпереименована вoptions.isolationLevel— формат значения изменён сREAD_COMMITTEDнаREAD COMMITTEDдля соответствия типуIsolationLevel; добавлен уровень изоляцииSNAPSHOT(#12231 от @Cprakhar) -
SAP HANA: устаревшие псевдонимы подключения удалены —
hanaClientDriver,pool.max,pool.requestTimeout,pool.idleTimeoutи другие удалены в пользу их современных эквивалентов (#12080 от @gioboa) -
Expo: устаревший драйвер удалён — драйвер Expo SQLite старой версии удалён; используйте Expo SDK v52+ с современным асинхронным API (#11860 от @G0maa)
-
Redis: поддержка устаревшего клиента удалена — для кэширования результатов запросов поддерживается только современный клиент Redis (v4+) (#12057 от @G0maa)
Удалённые API
-
ConnectionиConnectionOptionsудалены — используйтеDataSourceиDataSourceOptionsвместо этого (#12022 от @alumni) -
Свойство
.connectionпереименовано в.dataSource— свойствоconnectionвDriver,QueryRunner,EntityManager,QueryBuilder,EntityMetadataи всех интерфейсах подписчиков*Eventпереименовано вdataSource; для совместимости добавлен устаревший геттер (#12244, #12245, #12246, #12249 от @pkuczynski) -
ConnectionManagerи глобальные вспомогательные функции удалены — глобальные функцииcreateConnection,getConnection,getManager,getRepository,createQueryBuilderи другие удалены (#12098 от @michaelbromley) -
Глобальные функции
getMongoRepositoryиgetMongoManagerудалены — используйтеdataSource.getMongoRepository()иdataSource.mongoManagerвместо этого (#12099 от @pkuczynski) -
Свойство
DataSource.nameудалено — именованные подключения считались устаревшими в v0.3;ConnectionOptionsReader.all()переименован вget()(#12136 от @pkuczynski) -
Поддержка переменных окружения
TYPEORM_*удалена —ConnectionOptionsEnvReader,ormconfig.envи автоматическая загрузкаdotenvудалены (#12134 от @pkuczynski) -
findByIdsудалён — используйтеfindByс операторомInвместо этого (#12114 от @pkuczynski) -
findOneByIdудалён — используйте вместо негоfindOneBy(#12198 от @pkuczynski) -
Repository.exist()удалён — используйтеRepository.exists()вместо этого (#12131 от @pkuczynski) -
AbstractRepository,@EntityRepositoryиgetCustomRepositoryудалены — используйтеRepository.extend()вместо этого (#12096 от @pkuczynski) -
Декоратор
@RelationCountудалён — используйте@VirtualColumnс подзапросом вместо этого (#12181 от @pkuczynski) -
Система контейнера IoC удалена — функции
useContainer(),getFromContainer()и связанные типы были удалены (#12180 by @pkuczynski) -
Опция столбца
readonlyудалена — используйте вместо неёupdate: false(#12132 by @pkuczynski) -
Параметр
unsignedвColumnNumericOptionsудалён — затронуты только типы decimal/float; для целочисленных типовunsignedостаётся без изменений (#12133 by @pkuczynski) -
QueryBuilder: удалены
onConflict(), устаревшая перегрузкаorUpdate()иsetNativeParameters()— используйте вместо них сигнатуру массиваorIgnore()/orUpdate()иsetParameters()(#12090 by @pkuczynski) -
QueryBuilder:
printSql()удалён — метод был избыточным, так как все выполняемые запросы уже логируются через настроенный логгер; используйтеgetSql()илиgetQueryAndParameters()для проверки SQL (#12151 от @naorpeled, #12220 от @pkuczynski) -
QueryBuilder: псевдоним типа
WhereExpressionудалён — используйте вместо негоWhereExpressionBuilder(#12097 by @pkuczynski) -
QueryBuilder:
replacePropertyNames()удалена — эта функция не выполняла никаких действий (#12178 by @pkuczynski) -
Опция
joinдля поиска удалена — используйтеrelationsдля LEFT JOIN или QueryBuilder для других типов соединений (#12188 от @pkuczynski) -
Строковый синтаксис
selectудалён — используйте объектный синтаксисselect: { id: true }вместоselect: ["id"](#12214 от @pkuczynski) -
Строковый синтаксис
relationsудалён — используйте объектный синтаксисrelations: { profile: true }вместоrelations: ["profile"](#12215 от @pkuczynski) -
Устаревшие режимы блокировки удалены —
pessimistic_partial_writeиpessimistic_write_or_failзаменены наpessimistic_writeс опциейonLocked(#12093 by @pkuczynski) -
Свойства
QueryRunner.loadedTablesиloadedViewsудалены — используйте вместо нихgetTables()иgetViews()(#12183 by @pkuczynski) -
Метод
MigrationExecutor.getAllMigrations()удалён — используйте вместо негоgetPendingMigrations(),getExecutedMigrations()илиdataSource.migrations(#12142 by @pkuczynski) -
Статический метод
EntityMetadata.createPropertyPath()удалён — это внутренняя утилита, для которой нет публичной замены (#12141 by @pkuczynski) -
Внутренний механизм
nativeParametersудалён из драйверов и построителей запросов (#12104 by @pkuczynski) -
Внутренняя функция
broadcastLoadEventsForAll()удалена из Broadcaster (#12137 by @pkuczynski) -
Внутренняя функция
DriverUtils.buildColumnAlias()удалена — используйте вместо неёbuildAlias()(#12138 by @pkuczynski) -
RdbmsSchemaBuilder.renameTables()удалён — пустой метод, который никогда не вызывался (#12284 от @naorpeled)
Изменения в поведении
-
Не-nullable связи теперь используют INNER JOIN — связи
ManyToOneи владеющиеOneToOneс пометкойnullable: falseтеперь используютINNER JOINвместоLEFT JOIN, что может исключать строки с orphaned foreign keys (#12064 от @pkuczynski) -
Поведение
invalidWhereValuesBehaviorпо умолчанию установлено вthrow— передачаnullилиundefinedв условиях where теперь вызывает ошибку вместо тихого игнорирования свойства; используйтеIsNull()для сопоставления с null (#11710 от @naorpeled) -
invalidWhereValuesBehaviorограничен только высокоуровневыми API — методы.where(),.andWhere(),.orWhere()в QueryBuilder больше не зависят от этой настройки (#11878 от @naorpeled)
Новые возможности
Query Builder
-
INSERT INTO ... SELECT FROM ...— новый методvaluesFromSelect()вInsertQueryBuilderдля миграции данных и преобразовательных запросов (#11896 от @Cprakhar) -
Опция
returningдля update/upsert — методыupdate()иupsert()в репозитории и entity manager теперь поддерживают опциюreturningв СУБД с поддержкой предложенийRETURNING(#11782 от @naorpeled) -
Параметр
ifExistsво всех методах удаления —dropColumn,dropIndex,dropPrimaryKey,dropForeignKey,dropUniqueConstraint,dropCheckConstraint,dropExclusionConstraintи их множественные варианты теперь принимают флагifExists(#12121 от @pkuczynski) -
Явное управление ресурсами для
QueryRunner— поддерживает синтаксисawait using(TypeScript 5.2+) для автоматического освобождения ресурсов (#11701 от @alumni)
Драйверы
-
PostgreSQL:
ADD VALUEдля изменений enum — при добавлении новых значений enum TypeORM теперь использует упрощённый синтаксисALTER TYPE ... ADD VALUEвместо 4-этапного подхода переименовать-создать-мигрировать-удалить, где это возможно (#10956 от @janzipek) -
PostgreSQL: дополнительные расширения — новая опция
installExtensionsдля установки дополнительных расширений PostgreSQL при инициализации соединения (#11888 от @Cprakhar) -
PostgreSQL: поддержка частичных индексов — добавлена поддержка частичных индексов PostgreSQL (#11318 от @freePixel)
-
SAP HANA: блокировки в SELECT —
FOR UPDATEи другие режимы блокировок теперь поддерживаются в запросах SAP HANA (#11996 от @alumni) -
SAP HANA: комментарии к таблицам —
@Entity({ comment: "..." })теперь работает с SAP HANA (#11939 от @Cprakhar) -
SAP HANA: таймаут пула — новая опция пула
maxWaitTimeoutIfPoolExhausted(#11868 от @alumni) -
SQLite: тип столбца
jsonb— SQLite теперь поддерживает тип столбцаjsonb(#11933 от @Cprakhar) -
React Native: ключ шифрования — новая опция для передачи ключа шифрования в базах данных SQLite для React Native (#11736 от @HtSpChakradharCholleti)
Сохранение данных и Upsert
-
Каскадное очищение в
clear()—Repository.clear()иEntityManager.clear()теперь поддерживают опцию{ cascade: true }для выполненияTRUNCATE ... CASCADEв PostgreSQL, CockroachDB и Oracle (#11866 от @Cprakhar) -
Улучшенная типизация для
increment/decrement— параметр условий теперь использует правильные типы, учитывающие сущности, вместоany(#11294 от @OSA413)
Типы столбцов и декораторы
- Поддержка отложенных ограничений в
@Exclusion— реализует функциональность, аналогичную существующей поддержке в@Uniqueи@Index(#11802 от @oGAD31)
Прочие изменения
-
Автоматизированный codemod для миграции на v1 — новый пакет
@typeorm/codemodавтоматизирует большинство критических изменений: выполнитеnpx @typeorm/codemod v1 src/, чтобы обновить импорты, переименования API, синтаксис опций поиска и многое другое (#12233 от @pkuczynski) -
Улучшенная обработка ошибок ormconfig — сбои загрузки теперь логируются как предупреждения вместо беззвучного игнорирования (#11871 от @Cprakhar)
Исправления ошибок
Генерация запросов
-
Правильное экранирование псевдонимов столбцов в
orderBy— предотвращает SQL-ошибки при конфликте имён псевдонимов с зарезервированными словами (#12027 от @Cprakhar) -
addOrderByиспользует имена столбцов БД — теперь корректно работает указание имени столбца БД (например,created_at) вместо имени свойства (#11904 от @smith-xyz) -
Разрешение столбцов подзапросов при сортировке — исправлена ошибка "Cannot get metadata for given alias" при сортировке по столбцам подзапросов (#11343 от @trannhan0810)
-
Сохранение порядка столбцов в
select—getQuery()/getSql()теперь возвращает столбцы в порядке их добавления черезselect()иaddSelect()(#11902 от @Cprakhar) -
Исправлена генерация запросов
.update()— устранена некорректная генерация SQL при использовании.update()в QueryBuilder (#11993 от @gioboa) -
Генерация SQL для Upsert с псевдонимами таблиц — исправлены некорректные ссылки на столбцы в upsert-запросах при наследовании таблиц и пользовательских схемах (#11915 от @Cprakhar)
-
Limit с объединениями — исправлены некорректные результаты при использовании пагинации
skip/takeс объединениями таблиц (#11987 от @gioboa) -
Атрибуты соединения внутри скобок — исправлен парсинг join-условий, содержащих скобки (#11218 от @balkrushna)
-
Отключение глобального
ORDER BYдля агрегатных функций —repo.max(),repo.min()и аналогичные методы больше не генерируют невалидный SQL сORDER BY(#11925 от @Cprakhar) -
Субзапрос пагинации включает первичные ключи связанных сущностей —
leftJoinсskip/takeтеперь корректно загружает связанные сущности (#11669 от @mag123c) -
Сокращение алиасов для camelCase — метод
shortenтеперь корректно обрабатываетcamelCase_aliases(#11283 от @OSA413)
Связи и жадная загрузка
-
Удаление потерянных дочерних записей в отношении «один ко многим» с ненулевым внешним ключом — при сохранении отношения «один ко многим» с каскадом и заменой дочерних записей, потерянные строки с ненулевым внешним ключом теперь удаляются, а не вызывают нарушение ограничения; строки с нулевым внешним ключом по-прежнему обнуляются (#11982 от @naorpeled)
-
Eager relations теперь учитывают
relationLoadStrategy: "query"— при установке стратегии"query"eager relations загружаются отдельными запросами, а не с помощью JOIN (#11326 от @SharkSharp, #12256 от @pkuczynski) -
Коллизия алиасов в самореферентных связях — самореферентные связи с
relationLoadStrategy: "query"больше не генерируют некорректный SQL из-за коллизии алиасов (#11066 от @campmarc) -
Исключение двойного JOIN для жадных связей — явное указание жадной связи в
relationsбольше не вызывает дублирующих JOIN (#11991 от @veeceey) -
Сохранение с жадной загрузкой связей — исправлены ошибки сохранения сущностей с жадной загрузкой связей (#11975 от @gioboa)
-
Колонки с
select: falseисключаются из результатов — колонки, помеченныеselect: false, теперь корректно исключаются из результатов запросов (#11944 от @gioboa) -
Субзапросы с методами
joinMapOne— исправлено некорректное поведение при использовании map-методов соединения (#11943 от @gioboa) -
Идентификаторы связей во вложенных embedded-сущностях — исправлена ошибка
TypeError: Cannot set properties of undefinedпри маппинге идентификаторов связей внутри embedded-сущностей (#11942 от @Cprakhar) -
Обработка алиасов в
RelationIdLoader— использованиеDriverUtils.getAliasпредотвращает обрезку алиасов в СУБД с ограничениями на длину идентификаторов (#11228 от @te1) -
*-to-manyвcreatePropertyPath— удалена некорректная обработка ошибок, блокировавшая определённые конфигурации связей (#11119 от @ThbltLmr)
Сохранение данных
-
Upsert с
update: falseилиgeneratedType— upsert теперь корректно обрабатывает колонки, которые не должны обновляться (#12030 от @gioboa) -
Трансформеры значений для
FindOperator—ApplyValueTransformersтеперь корректно применяется к значениям внутриFindOperator(напримерIn,Betweenи др.) (#11172 от @ZimGil) -
Мягкое удаление больше не обновляет уже удалённые строки —
softDeleteиsoftRemoveтеперь пропускают строки, уже подвергнутые мягкому удалению (#10705 от @hassanmehdi98) -
Слияние сущностей теперь учитывает значения
null— при слиянии в сущность значения свойств, равныеnull, больше не игнорируются без уведомления (#11154 от @knoid) -
Сравнение Map/объектов — исправлено некорректное обнаружение изменений для значений столбцов типа Map и простых объектов (#10990 от @mgohin)
-
Обнаружение изменений в преобразователях даты — исправлено ложное срабатывание при обнаружении изменений при использовании преобразователей значений даты (#11963 от @gioboa)
-
Обновление mpath дочерних элементов — путь mpath древовидной сущности теперь корректно обновляется при изменении родителя, даже с мягко удалёнными родителями (#10844 от @JoseCToscano)
-
Распространение схемы/базы данных на closure junction tables — настройки схемы и базы данных теперь корректно применяются к closure junction tables (#12110 от @pkuczynski)
-
Обработка виртуальных свойств в построителе схемы — построитель схемы больше не пытается создавать столбцы для виртуальных свойств (#11000 от @skyran1278)
-
Удаление безымянного
TableForeignKey— удаление внешнего ключа без явно указанного имени больше не вызывает ошибку (#10744 от @taichunmin) -
getPendingMigrationsбольше не создаёт таблицу миграций — проверка ожидающих миграций больше не имеет побочных эффектов (#11672 от @pkuczynski)
Исправления для конкретных драйверов
-
PostgreSQL: сохранение/гидрация
timestamptz— столбцыtimestamp with time zoneтеперь корректно сохраняются и гидратируются (#11774 от @Minishlink) -
PostgreSQL: повторное сохранение геометрических типов — значения point/circle теперь нормализуются при сохранении, чтобы избежать ошибок недопустимых входных данных при повторном сохранении гидратированных объектов (#11857 от @Cprakhar)
-
PostgreSQL/CockroachDB: таблицы с экранированными именами — исправлена обработка таблиц со специальными символами в именах (#10993 от @iskalyakin)
-
PostgreSQL: последовательное выполнение запросов — запросы теперь выполняются последовательно на одном соединении для избежания предупреждений об устаревании в
pg8.19.0 (#12105 от @pkuczynski) -
MySQL: определение версии PolarDB-X 2.0 —
getVersion()больше не возвращаетundefinedдля PolarDB-X 2.0 (#11837 от @Missna) -
MongoDB: преобразование имён свойств
ObjectIdColumn—findOneBy({ id: value })теперь корректно преобразуется в_idв запросах MongoDB (#12200 от @pkuczynski) -
MongoDB: вложенные массивы в документах — корректная обработка встроенных массивов внутри структур вложенных документов (#10940 от @mciuchitu)
-
SQLite: массивы для simple-enum — колонки
simple-enumс опциейarray: trueбольше не вызывают ошибок CHECK-ограничений (#11865 от @Cprakhar) -
SAP HANA: экранирование параметров
Date— значения JSDateтеперь передаются как параметры запросов вместо встраивания в SQL-строки (#11867 от @alumni) -
CockroachDB: структурированные результаты при повторе транзакций — флаг
useStructuredResultтеперь сохраняется при повторе транзакций CockroachDB (#11861 от @naorpeled) -
Cordova: количество затронутых строк — результаты запросов теперь включают счётчик затронутых строк (#10873 от @jacobg)
Прочие изменения
-
Команда CLI
init— больше не завершается с ошибкой при отсутствииpackage.json(#11947 от @gioboa); опубликованный пакет теперь правильно включаетdevDependencies, необходимые для создания шаблона (#12281 от @pkuczynski) -
Импорт
processв Deno — исправлен некорректный импорт зависимостиprocessдля Deno (#11248 от @yohannpoli)
Исправления безопасности
-
Защита от SQL-инъекций — во всех драйверах для интроспекции схемы и DDL-методов теперь используются параметризованные запросы и экранированные идентификаторы, предотвращая SQL-инъекции через имена БД/схем/таблиц/колонок (#12207 от @pkuczynski, #12197 от @pkuczynski, #12185 от @pkuczynski)
-
Валидация условий OrderBy — методы QueryBuilder
orderByиaddOrderByтеперь проверяют значения условий во время выполнения, предотвращая инъекции через выражения сортировки (#12217 от @pkuczynski)
Улучшения производительности
- PostgreSQL / CockroachDB: групповое удаление в
clearDatabase()— индивидуальные DROP-операции объединяются в пакетные запросы, значительно сокращая количество сетевых обращений при настройке тестов (#12164, #12159 от @pkuczynski)