Как получить sql запрос в sequlize
Рассмотим базовые операции с данными на примере модели из прошлой темы:
const Sequelize = require("sequelize"); const sequelize = new Sequelize("usersdb", "root", "123456", < dialect: "mysql", host: "localhost", define: < timestamps: false >>); const User = sequelize.define("user", < id: < type: Sequelize.INTEGER, autoIncrement: true, primaryKey: true, allowNull: false >, name: < type: Sequelize.STRING, allowNull: false >, age: < type: Sequelize.INTEGER, allowNull: false >>);
Добавление данных
Для добавления данных в бд у модели вызывается метод create() , в который передается добавляемый объект:
User.create(< name: "Tom", age: 35 >).then(res=>< console.log(res); >).catch(err=>console.log(err));
Как мы видим, свойства передаваемого в метод create объекта соответствуют свойствам модели User за исключением свойства id, которое генерируется базой данных.
После операции добавления мы можем получить добавленный объект, в том числе его id, сгенерированный базой данных:
User.create(< name: "Bob", age: 31 >).then(res=> < const user = console.log(user); >).catch(err=>console.log(err));
Получение данных
Для извлечения всех данных применяется метод findAll() :
User.findAll().then(users=>< console.log(users); >).catch(err=>console.log(err));
В данном случае в метод передается необязательный объект , который позволяет получить непосредственно данны из БД в вид объектов без дополнительных метаданных. Например, консольный вывод в моем случае выглядел следующим образом:
Простейшая фильтрация
Для применения фильтрации при получении данных (а также при обновлении и удалении) применяется оператор where , который указывает на критерий фильтрации. Например, выберем из БД всех пользователей, у которых name=»Tom»:
User.findAll(, raw: true >) .then(users=>< console.log(users); >).catch(err=>console.log(err));
Консольный вывод в данном случае:
Получение одного объекта
Нередко необходимо получить лишь один объект из БД. В этом случае мы можем использовать такие методы как findByPk() (получает объект по первичному ключу) и findOne() (получает один объект по определенному критерию). Например, получим пользователя с >
User.findByPk(2) .then(user=>< if(!user) return; // если пользователь не найден console.log(user.name); >).catch(err=>console.log(err));
Или получим одного пользователя с именем Tom:
User.findOne(>) .then(user=>< if(!user) return; console.log(user.name, user.age); >).catch(err=>console.log(err));
Обновление
Для обновления применяется метод update() , в который передается объект с новыми значениями и объект-критерий выборки обновляемых объектов:
User.update(< age: 36 >, < where: < name: "Bob" >>).then((res) => < console.log(res); >);
В данном случае первый объект указывает, что все обновляемые объекты будут получать для поля age значение 36. Второй объект указывает на критерий выборки — обновляются только объекты, у которых name=»Bob».
Удаление
Для удаления используется метод destroy() , в который передается объект-критерий выборки удаляемых объектов:
User.destroy( < where: < name: "Bob" >>).then((res) => < console.log(res); >);
В данном случае удаляются объекты, у которых name=»Bob».
`Sequelize ORM` как взять специфический атрибут и переименовать его в запросе?
У меня возникла такая проблема с работой в node . У меня подключена библиотека Sequelize для работы с базой данных MySQL . И вот я хочу сделать запрос и взять только специфические атрибуты из таблиц переименовав их. Делаю все так как написано в доке. Но после я получаю такой запрос, в катором имена атрибутов вообще другие. Они с названиями моделей. Вот пример запроса и то что выдает мне запрос.
await User.findAll(< attributes: ['id'], where: , include: < model: StatusGroup, attributes: ['status'], include: < model: Organization, attributes: [['id', 'organization_id'], ['type_id', 'group_id']], where: > > >, raw : true >);
Ответ
А сам запрос mysql выглидит так.
SELECT `users`.`id`, `StatusGroupContacts`.`status` AS `StatusGroupContacts.status`, `StatusGroupContacts->Organizations`.`id` AS `StatusGroupContacts.Organizations.id`, `StatusGroupContacts->Organizations`.`id` AS `StatusGroupContacts.Organizations.organization_id`, `StatusGroupContacts->Organizations`.`type_id` AS `StatusGroupContacts.Organizations.group_id` FROM `user` AS `users` LEFT JOIN ( `chat_user_group_status` AS `StatusGroupContacts` LEFT JOIN `organization` AS `StatusGroupContacts->Organizations` ON `StatusGroupContacts`.`user_id` = `StatusGroupContacts->Organizations`.`type_id` ) ON `users`.`id` = `StatusGroupContacts`.`user_id` WHERE `users`.`id` = 1
Но я хочу что бы запрос был вот так. (Ну по логике так как написано в доке.)
SELECT `user`.id, `organization`.id AS organization_id, `organization`.`type_id` AS group_id, chat_user_group_status.status FROM `user` LEFT JOIN `chat_user_group_status` ON `user`.`id` = `chat_user_group_status`.`user_id` LEFT JOIN `organization` ON `chat_user_group_status`.`group_id` = `organization`.`type_id` WHERE `user`.id = 1
Кто может подсказать мне что я делаю не так ? И как исправить это?
Как сделать запрос в sequelize?
Можно ли так сделать? Или в таблице results нужно добавлять поле user_id?
- Вопрос задан более трёх лет назад
- 96 просмотров
Комментировать
Решения вопроса 0
Ответы на вопрос 0
Ваш ответ на вопрос
Войдите, чтобы написать ответ

- SQL
- +1 ещё
Массив структур в Hive. Как проверить вхождение в массив структуры по маске?
- 1 подписчик
- вчера
- 72 просмотра
Sequelize
Sequelize — это инструмент для организации взаимодействия между платформой Node.js и реляционными базами данными без использования специального языка запросов SQL. Sequelize относится к объектно-реляционным сопоставителям (ORM): связывает базы данных (Postgres, MySQL, MariaDB, SQLite и Microsoft SQL Server) с объектами JavaScript, создавая виртуальную объектную базу данных.


Освойте профессию «Аналитик данных»
Установка Sequelize и подключение к базе данных
Для установки Sequelize с помощью менеджера пакетов NPM нужно выполнить команду:
$ npm install —save sequelize
После этого необходимо установить драйвер для взаимодействия с базой данных, которая используется в приложении.
Postgres:
$ npm install —save pg pg-hstore
MySQL:
$ npm install —save mysql2
MariaDB:
$ npm install —save mariadb
SQLite:
$ npm install —save sqlite3
Microsoft SQL Server:
$ npm install —save tedious
Профессия / 12 месяцев
Аналитик данных
Находите закономерности и делайте выводы, которые помогут бизнесу

После установки драйвера выполняют подключение к базе данных. Это можно сделать несколькими способами в зависимости от типа базы:
Способ 1 — с передачей уникального идентификатора URI:
const sequelize = new Sequelize(‘sqlite::memory:’) // (для SQLite)
const sequelize = new Sequelize(‘postgres://user:pass@
example.com:5432/dbname) // (для Postgres)
Способ 2 — с передачей параметров подключения по отдельности (для SQLite)
const sequelize = new Sequelize(dialect: ‘sqlite’,
storage: ‘path/to/database.sqlite’
>);
Способ 3 — с передачей параметров подключения по отдельности (для остальных баз данных)
const sequelize = new Sequelize(‘database’, ‘username’, ‘password’, < host: ‘localhost’,
dialect: /* один из ‘mysql’ | ‘mariadb’ | ‘postgres’ | ‘mssql’ */>);
Для проверки подключения используется функция .authenticate():try
< await sequelize.authenticate();
console.log(‘Установлено подключение к базе данных.’);> catch (error) console.error(‘Не удалось установить подключение к базе данных:’, error);
>
Для закрытия подключения вызывают функцию sequelize.close().
Ознакомиться с подробной документацией можно в соответствующем разделе.

Станьте аналитиком данных и получите востребованную специальность
Концепция и создание моделей
Модель в Sequelize — это абстракция, которая представляет собой таблицу базы данных. Она передает системе название, количество столбцов и тип содержащейся в них информации. Каждая модель имеет собственное имя. Чаще всего оно совпадает с названием таблицы. Например, если таблица называется Accounts («учетные записи», множественное число), то имя модели будет Account («учетная запись», единственное число).
Для определения моделей в Sequelize существует два способа:
- Вызов sequelize.define(modelName, attributes, options) с передачей функции имени модели, атрибутов и опций.
- Расширение класса Model и вызов init(attributes, options) с передачей атрибутов и опций.
Рассмотрим создание модели на примере. Предположим, что у нас есть таблица Accounts, и на ее основе мы хотим создать модель Account, в которой будут содержаться данные учетных записей пользователей — userLogin и userPassword. Для обращения к модели будет использоваться метод sequelize.models.Account.
Первый способ – с использованием sequelize.define:
const < Sequelize, DataTypes >= require(‘sequelize’);
const sequelize = new Sequelize(‘sqlite::memory:’);
const Account = sequelize.define(‘Account’, // определение атрибутов модели
userLogin: type: DataTypes.STRING,
allowNull: false
>,
userPassword: type: DataTypes.STRING
// значение allowNull равно true по умолчанию
>
>, // другие опции модели
>);
// `sequelize.define` возвращает созданную модель
console.log(Account === sequelize.models.Account); // true
Второй способ — расширение класса Model:
const < Sequelize, DataTypes, Model >= require(‘sequelize’);
const sequelize = new Sequelize(‘sqlite::memory:’);
class Account extends Model <>
Account.init(// определение атрибутов
userLogin: type: DataTypes.STRING,
allowNull: false
>,
userPassword: type: DataTypes.STRING
// значение allowNull равно по умолчанию true
>
>,// дополнительные опции
sequelize, // создание подключения
modelName: ‘Account’ // определение имени модели
>);
// определяемой моделью является сам класс
console.log(Account === sequelize.models.Account); // true
Во время создания модели с помощью первого способа sequelize.define вызывает Model.init, поэтому оба подхода являются равнозначными.

Геттеры, сеттеры и виртуальные атрибуты
Геттер — это функция get(), определенная для одного столбца модели. Как и в случае со стандартными геттерами JavaScript, геттеры Sequelize автоматически вызываются во время чтения значений в полях столбца.
Сеттер — это функция set(), которая также определяется для конкретного столбца модели. Сеттер получает устанавливаемое значение.
Sequelize позволяет определять пользовательские геттеры и сеттеры для атрибутов моделей. Кроме того, предусмотрено определение виртуальных атрибутов — они не существуют в исходной таблице базы данных, Sequelize создает их автоматически. Например, если в модели User («пользователь») имена и фамилии хранятся по отдельности, в полях firstName и lastName, Sequelize может создать виртуальное поле fullName («полное имя»), в котором имя и фамилия находятся вместе. Создание виртуального атрибута выполняется с помощью специального типа данных — DataTypes.VIRTUAL:
const < DataTypes >= require(«sequelize»);
const User = sequelize.define(‘user’, firstName: DataTypes.TEXT,
lastName: DataTypes.TEXT,
fullName: type: DataTypes.VIRTUAL,
get() return `$ $`;
>,
set(value) throw new Error(‘Не пытайтесь установить значение`fullName`!’); >
>
>);
Sequelize предоставляет программистам возможность работать с реляционными базами данных, не используя специальный язык запросов SQL. Во время создания, удаления, чтения и обновления объектов в приложении Sequelize самостоятельно строит и выполняет все запросы к базе данных.
Аналитик данных
Аналитики влияют на рост бизнеса. Они выясняют, какой товар и в какое время больше покупают. Считают юнит-экономику. Оценивают окупаемость рекламной кампании. Поэтому компании ищут и переманивают таких специалистов.
