API репозиториев
Эта страница переведена PageTurner AI (бета). Не одобрена официально проектом. Нашли ошибку? Сообщить о проблеме →
API Repository
manager- Используемый этим репозиториемEntityManager.
const manager = repository.manager
metadata-EntityMetadataсущности, управляемой этим репозиторием.
const metadata = repository.metadata
queryRunner- Построитель запросов, используемыйEntityManager. Применяется только в транзакционных экземплярах EntityManager.
const queryRunner = repository.queryRunner
target- Класс целевой сущности, управляемой этим репозиторием. Используется только в транзакционных экземплярах EntityManager.
const target = repository.target
createQueryBuilder- Создает построитель запросов для формирования SQL-запросов. Подробнее о QueryBuilder.
const users = await repository
.createQueryBuilder("user")
.where("user.name = :name", { name: "John" })
.getMany()
hasId- Проверяет, определено ли свойство первичной колонки у указанной сущности.
if (repository.hasId(user)) {
// ... do something
}
getId- Получает значения свойств первичной колонки указанной сущности. При наличии составных первичных ключей возвращается объект с именами и значениями первичных колонок.
const userId = repository.getId(user) // userId === 1
create- Создает новый экземплярUser. Дополнительно принимает объект со свойствами пользователя, которые будут записаны в созданный объект.
const user = repository.create() // same as const user = new User();
const user = repository.create({
id: 1,
firstName: "Timber",
lastName: "Saw",
}) // same as const user = new User(); user.firstName = "Timber"; user.lastName = "Saw";
merge- Объединяет несколько сущностей в одну.
const user = new User()
repository.merge(user, { firstName: "Timber" }, { lastName: "Saw" }) // same as user.firstName = "Timber"; user.lastName = "Saw";
-
preload- Создает новую сущность из переданного объекта JavaScript. Если сущность уже существует в базе данных, она загружается (вместе со связанными данными), все её значения заменяются новыми из переданного объекта, и возвращается обновлённая сущность. Фактически возвращается сущ ность из БД с заменёнными свойствами.Примечание: переданный объект должен содержать идентификатор сущности / первичный ключ для поиска. Возвращает undefined, если сущность не найдена.
const partialUser = {
id: 1,
firstName: "Rizzrak",
profile: {
id: 1,
},
}
const user = await repository.preload(partialUser)
// user will contain all missing data from partialUser with partialUser property values:
// { id: 1, firstName: "Rizzrak", lastName: "Saw", profile: { id: 1, ... } }
save- Сохраняет указанную сущность или массив сущностей. Если сущность существует в базе данных, она обновляется. Если сущность отсутствует в базе данных, она добавляется. Все сущности сохраняются в одной транзакции (для отдельной сущности менеджер не является транзакционным). Поддерживает частичное обновление — неопределённые свойства пропускаются. Возвращает сохранённую сущность/сущности.
await repository.save(user)
await repository.save([category1, category2, category3])
remove- Удаляет указанную сущность или массив сущностей. Все сущности удаляются в одной транзакции (для отдельной сущности менеджер не является транзакционным). Возвращает удалённую сущность/сущности.
await repository.remove(user)
await repository.remove([category1, category2, category3])
insert- Добавляет новую сущность или массив сущностей.
await repository.insert({
firstName: "Timber",
lastName: "Timber",
})
await repository.insert([
{
firstName: "Foo",
lastName: "Bar",
},
{
firstName: "Rizz",
lastName: "Rak",
},
])
update- Обновляет сущности по их id, массиву id или условиям. Устанавливает поля из частичного объекта сущности.
await repository.update({ age: 18 }, { category: "ADULT" })
// executes UPDATE user SET category = ADULT WHERE age = 18
await repository.update(1, { firstName: "Rizzrak" })
// executes UPDATE user SET firstName = Rizzrak WHERE id = 1
// optionally request RETURNING / OUTPUT values (supported drivers only)
const result = await repository.update(
1,
{ firstName: "Rizzrak" },
{ returning: ["id", "firstName"] },
)
console.log(result.raw) // [{ id: 1, firstName: "Rizzrak" }]
updateAll- Обновляет все сущности указанного типа (без условия WHERE). Устанавливает поля из частичного объекта сущности.
await repository.updateAll({ category: "ADULT" })
// executes UPDATE user SET category = ADULT
await repository.updateAll(
{ category: "ADULT" },
{ returning: "*" }, // limited to drivers that support returning clauses
)
upsert- Добавляет новую сущность или массив сущностей, если они не существуют, либо обновляет существующие. Поддерживается в AuroraDataApi, Cockroach, Mysql, Postgres и Sqlite.
При обновлении во время upsert-операции (из-за конфликта) специальные колонки вроде @UpdateDateColumn и @VersionColumn автоматически обновляются.
await repository.upsert(
[
{ externalId: "abc123", firstName: "Rizzrak" },
{ externalId: "bca321", firstName: "Karzzir" },
],
["externalId"],
)
/** executes
* INSERT INTO user
* VALUES
* (externalId = abc123, firstName = Rizzrak),
* (externalId = cba321, firstName = Karzzir),
* ON CONFLICT (externalId) DO UPDATE
* SET firstName = EXCLUDED.firstName,
* updatedDate = CURRENT_TIMESTAMP,
* version = version + 1
**/
Также можно запросить возвращаемые значения после операции upsert (поддерживается драйверами с возможностями RETURNING / OUTPUT):
const { raw } = await repository.upsert(
{ externalId: "abc123", firstName: "Rizzrak" },
{
conflictPaths: ["externalId"],
returning: ["externalId", "firstName"],
},
)
console.log(raw) // [{ externalId: "abc123", firstName: "Rizzrak" }]
await repository.upsert(
[
{ externalId: "abc123", firstName: "Rizzrak" },
{ externalId: "bca321", firstName: "Karzzir" },
],
{
conflictPaths: ["externalId"],
skipUpdateIfNoValuesChanged: true, // supported by postgres, skips update if it would not change row values
upsertType: "upsert", // "on-conflict-do-update" | "on-duplicate-key-update" | "upsert" - optionally provide an UpsertType - 'upsert' is currently only supported by CockroachDB
},
)
/** executes
* INSERT INTO user
* VALUES
* (externalId = abc123, firstName = Rizzrak),
* (externalId = cba321, firstName = Karzzir),
* ON CONFLICT (externalId) DO UPDATE
* SET firstName = EXCLUDED.firstName
* WHERE user.firstName IS DISTINCT FROM EXCLUDED.firstName
**/
await repository.upsert(
[
{ externalId: "abc123", firstName: "Rizzrak", dateAdded: "2020-01-01" },
{ externalId: "bca321", firstName: "Karzzir", dateAdded: "2022-01-01" },
],
{
conflictPaths: ["externalId"],
skipUpdateIfNoValuesChanged: true, // supported by postgres, skips update if it would not change row values
indexPredicate: "dateAdded > 2020-01-01", // supported by postgres, allows for partial indexes
},
)
/** executes
* INSERT INTO user
* VALUES
* (externalId = abc123, firstName = Rizzrak, dateAdded = 2020-01-01),
* (externalId = cba321, firstName = Karzzir, dateAdded = 2022-01-01),
* ON CONFLICT (externalId) WHERE ( dateAdded > 2021-01-01 ) DO UPDATE
* SET firstName = EXCLUDED.firstName,
* SET dateAdded = EXCLUDED.dateAdded,
* WHERE user.firstName IS DISTINCT FROM EXCLUDED.firstName OR user.dateAdded IS DISTINCT FROM EXCLUDED.dateAdded
**/
delete- Удаляет сущности по идентификатору, массиву идентификаторов или условиям:
await repository.delete(1)
await repository.delete([1, 2, 3])
await repository.delete({ firstName: "Timber" })
deleteAll- Удаляет все сущности указанного типа (без условия WHERE).
await repository.deleteAll()
// executes DELETE FROM user
См. также метод clear, который выполняет операцию TRUNCATE TABLE.
softDeleteиrestore- Мягкое удаление и восстановление строки по идентификатору, массиву идентификаторов или условиям:
const repository = dataSource.getRepository(Entity)
// Soft delete an entity
await repository.softDelete(1)
// And you can restore it using restore;
await repository.restore(1)
// Soft delete multiple entities
await repository.softDelete([1, 2, 3])
// Or soft delete by other attribute
await repository.softDelete({ firstName: "Jake" })
softRemoveиrecover- АльтернативаsoftDeleteиrestore.
// You can soft-delete them using softRemove
const entities = await repository.find()
const entitiesAfterSoftRemove = await repository.softRemove(entities)
// And You can recover them using recover;
await repository.recover(entitiesAfterSoftRemove)
increment- Увеличивает значение столбца на указанную величину для сущностей, соответствующих условиям.
await repository.increment({ firstName: "Timber" }, "age", 3)
decrement- Уменьшает значение столбца на указанную величину для сущностей, соответствующих условиям.
await repository.decrement({ firstName: "Timber" }, "age", 3)
exists- Проверяет существование хотя бы одной сущности, соответствующейFindOptions.
const exists = await repository.exists({
where: {
firstName: "Timber",
},
})
existsBy- Проверяет существование хотя бы одной сущности, соответствующейFindOptionsWhere.
const exists = await repository.existsBy({ firstName: "Timber" })
count- Считает сущности, соответствующиеFindOptions. Полезно для пагинации.
const count = await repository.count({
where: {
firstName: "Timber",
},
})
countBy- Считает сущности, соответствующиеFindOptionsWhere. Полезно для пагинации.
const count = await repository.countBy({ firstName: "Timber" })
sum- Возвращает сумму числового поля для всех сущностей, соответствующихFindOptionsWhere.
const sum = await repository.sum("age", { firstName: "Timber" })
average- Возвращает среднее значение числового поля для всех сущностей, соответствующихFindOptionsWhere.
const average = await repository.average("age", { firstName: "Timber" })
minimum- Возвращает минимальное значение числового поля для всех сущностей, соответствующихFindOptionsWhere.
const minimum = await repository.minimum("age", { firstName: "Timber" })
maximum- Возвращает максимальное значение числового поля для всех сущностей, соответствующихFindOptionsWhere.
const maximum = await repository.maximum("age", { firstName: "Timber" })
find- Находит сущности, соответствующиеFindOptions.
const timbers = await repository.find({
where: {
firstName: "Timber",
},
})
findBy- Находит сущности, соответствующиеFindWhereOptions.
const timbers = await repository.findBy({
firstName: "Timber",
})
findAndCount- Находит сущности, соответствующиеFindOptions. Дополнительно подсчитывает все подходящие сущности, игнорируя настройки пагинации (параметры from и take).
const [timbers, timbersCount] = await repository.findAndCount({
where: {
firstName: "Timber",
},
})
findAndCountBy- Находит сущности, соответствующие заданнымFindOptionsWhere. Также подсчитывает все подходящие сущности, игнорируя параметры пагинации (from и take).
const [timbers, timbersCount] = await repository.findAndCountBy({
firstName: "Timber",
})
findOne- Находит первую сущность, соответствующую заданнымFindOptions.
const timber = await repository.findOne({
where: {
firstName: "Timber",
},
})
findOneBy- Находит первую сущность, соответствующую заданнымFindOptionsWhere.
const timber = await repository.findOneBy({ firstName: "Timber" })
findOneOrFail- Находит первую сущность по ID или условиям поиска. Отклоняет промис, если совпадений не найдено.
const timber = await repository.findOneOrFail({
where: {
firstName: "Timber",
},
})
findOneByOrFail- Находит первую сущность, соответствующую заданнымFindOptions. Отклоняет промис, если совпадений не найдено.
const timber = await repository.findOneByOrFail({ firstName: "Timber" })
query- Выполняет сырой SQL-запрос.
const rawData = await repository.query(`SELECT * FROM USERS`)
// You can also use parameters to avoid SQL injection
// The syntax differs between the drivers
// aurora-mysql, better-sqlite3, capacitor, cordova,
// expo, mariadb, mysql, nativescript, react-native,
// sap, sqlite, sqljs
const rawData = await repository.query(
"SELECT * FROM USERS WHERE name = ? and age = ?",
["John", 24],
)
// aurora-postgres, cockroachdb, postgres
const rawData = await repository.query(
"SELECT * FROM USERS WHERE name = $1 and age = $2",
["John", 24],
)
// oracle
const rawData = await repository.query(
"SELECT * FROM USERS WHERE name = :1 and age = :2",
["John", 24],
)
// spanner
const rawData = await repository.query(
"SELECT * FROM USERS WHERE name = @param0 and age = @param1",
["John", 24],
)
// mssql
const rawData = await repository.query(
"SELECT * FROM USERS WHERE name = @0 and age = @1",
["John", 24],
)
clear- Очищает все данные из указанной таблицы (выполняет TRUNCATE/DROP).
await repository.clear()
Дополнительные опции
Для метода save можно передать необязательный параметр SaveOptions.
-
data- Дополнительные данные для передачи в метод сохранения. Могут использоваться в подписчиках. -
listeners: boolean - Определяет, вызывать ли слушатели и подписчики для операции. По умолчанию включено; отключите через{ listeners: false }в опциях save/remove. -
transaction: boolean - По умолчанию транзакции включены, все запросы операции удаления выполняются в транзакции. Отключите через{ transaction: false }. -
chunk: number - Разбивает сохранение на группы указанного размера. Например, для сохранения 100 000 объектов с проблемами, задайте{ chunk: 10000 }для разбивки на группы по 10 000. Полезно при ограничениях драйвера на количество параметров. -
reload: boolean - Определяет, нужно ли перезагружать сущность во время сохранения. Работает только в СУБД без поддержки RETURNING/OUTPUT. Включено по умолчанию.
Пример:
userRepository.save(users, { chunk: 1000 })
Для методов remove и delete можно передать необязательный параметр RemoveOptions.
-
data- Дополнительные данные для передачи в метод удаления. Могут использоваться в подписчиках. -
listeners: boolean - Определяет, вызывать ли слушатели и подписчики для операции. По умолчанию включено; отключите через{ listeners: false }в опциях save/remove. -
transaction: boolean - По умолчанию транзакции включены, все запросы операции удаления выполняются в транзакции. Отключите через{ transaction: false }. -
chunk: number - Разбивает удаление на группы указанного размера. Например, для удаления 100 000 объектов с проблемами, задайте{ chunk: 10000 }для разбивки на группы по 10 000. Полезно при ограничениях драйвера на к оличество параметров.
Пример:
userRepository.remove(users, { chunk: 1000 })
API TreeRepository
Для API TreeRepository обратитесь к документации по древовидным сущностям.
API MongoRepository
Для API MongoRepository обратитесь к документации по MongoDB.