Перейти к основному содержанию

Примечания к выпуску TypeORM 1.0

Неофициальный Бета-перевод

Эта страница переведена PageTurner AI (бета). Не одобрена официально проектом. Нашли ошибку? Сообщить о проблеме →

TypeORM 1.0 — это мажорный релиз, который удаляет давно устаревшие API, модернизирует системные требования и включает десятки исправлений ошибок и новых функций, накопленных в течение цикла версий 0.3.x.

Критические изменения

Подробные инструкции по обновлению смотрите в Руководстве по миграции.

Системные требования

  • Требуется Node.js 20+ — поддержка Node.js 16 и 18 прекращена, минимальной целевой версией JavaScript теперь является ES2023 (#11382 от @alumni)

  • Удалён полифил Buffer — для бинарных данных на платформах вне Node.js теперь используется Uint8Array; Node.js Buffer (который расширяет Uint8Array) продолжает работать как прежде (#11935 от @pujux)

  • Замена библиотеки globglob заменён на 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)

  • 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)

  • 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)

  • 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() переименована в logQuery() (#12151 by @naorpeled)

  • QueryBuilder: псевдоним типа WhereExpression удалён — используйте вместо него WhereExpressionBuilder (#12097 by @pkuczynski)

  • QueryBuilder: replacePropertyNames() удалена — эта функция не выполняла никаких действий (#12178 by @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)

Изменения в поведении

  • Поведение 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: блокировки в SELECTFOR 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)

Прочие изменения

  • Улучшенная обработка ошибок ormconfig — сбои загрузки теперь логируются как предупреждения вместо беззвучного игнорирования (#11871 от @Cprakhar)

Исправления ошибок

Генерация запросов

  • Правильное экранирование псевдонимов столбцов в orderBy — предотвращает SQL-ошибки при конфликте имён псевдонимов с зарезервированными словами (#12027 от @Cprakhar)

  • addOrderBy использует имена столбцов БД — теперь корректно работает указание имени столбца БД (например, created_at) вместо имени свойства (#11904 от @smith-xyz)

  • Разрешение столбцов подзапросов при сортировке — исправлена ошибка "Cannot get metadata for given alias" при сортировке по столбцам подзапросов (#11343 от @trannhan0810)

  • Сохранение порядка столбцов в selectgetQuery()/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)

Связи и жадная загрузка

  • Коллизия алиасов в самореферентных связях — самореферентные связи с 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)

  • Трансформеры значений для FindOperatorApplyValueTransformers теперь корректно применяется к значениям внутри FindOperator (например In, Between и др.) (#11172 от @ZimGil)

  • Мягкое удаление больше не обновляет уже удалённые строкиsoftDelete и softRemove теперь пропускают строки, уже подвергнутые мягкому удалению (#10705 от @hassanmehdi98)

  • Слияние сущностей теперь учитывает значения null — при слиянии в сущность значения свойств, равные null, больше не игнорируются без уведомления (#11154 от @knoid)

  • Сравнение Map/объектов — исправлено некорректное обнаружение изменений для значений столбцов типа Map и простых объектов (#10990 от @mgohin)

  • Обнаружение изменений в преобразователях даты — исправлено ложное срабатывание при обнаружении изменений при использовании преобразователей значений даты (#11963 от @gioboa)

  • Обновление mpath дочерних элементов — путь mpath древовидной сущности теперь корректно обновляется при изменении родителя, даже с мягко удалёнными родителями (#10844 от @JoseCToscano)

  • Обработка виртуальных свойств в построителе схемы — построитель схемы больше не пытается создавать столбцы для виртуальных свойств (#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: последовательное выполнение запросов — запросы теперь выполняются последовательно на одном соединении для избежания предупреждений об устаревании в pg 8.19.0 (#12105 от @pkuczynski)

  • MySQL: определение версии PolarDB-X 2.0getVersion() больше не возвращает undefined для PolarDB-X 2.0 (#11837 от @Missna)

  • MongoDB: преобразование имён свойств ObjectIdColumnfindOneBy({ id: value }) теперь корректно преобразуется в _id в запросах MongoDB (#12200 от @pkuczynski)

  • MongoDB: вложенные массивы в документах — корректная обработка встроенных массивов внутри структур вложенных документов (#10940 от @mciuchitu)

  • SQLite: массивы для simple-enum — колонки simple-enum с опцией array: true больше не вызывают ошибок CHECK-ограничений (#11865 от @Cprakhar)

  • SAP HANA: экранирование параметров Date — значения JS Date теперь передаются как параметры запросов вместо встраивания в SQL-строки (#11867 от @alumni)

  • CockroachDB: структурированные результаты при повторе транзакций — флаг useStructuredResult теперь сохраняется при повторе транзакций CockroachDB (#11861 от @naorpeled)

  • Cordova: количество затронутых строк — результаты запросов теперь включают счётчик затронутых строк (#10873 от @jacobg)

Прочие изменения

  • Команда CLI init — больше не завершается с ошибкой при отсутствии package.json (#11947 от @gioboa)

  • Импорт process в Deno — исправлен некорректный импорт зависимости process для Deno (#11248 от @yohannpoli)

Исправления безопасности

  • Защита от SQL-инъекций — во всех драйверах для интроспекции схемы и DDL-методов теперь используются параметризованные запросы и экранированные идентификаторы, предотвращая SQL-инъекции через имена БД/схем/таблиц/колонок (#12207 от @pkuczynski, #12197 от @pkuczynski, #12185 от @pkuczynski)

Улучшения производительности

  • PostgreSQL / CockroachDB: групповое удаление в clearDatabase() — индивидуальные DROP-операции объединяются в пакетные запросы, значительно сокращая количество сетевых обращений при настройке тестов (#12164, #12159 от @pkuczynski)