Перейти к содержимому

Как получить sql запрос в sequlize

  • автор:

Sequelize

Sequelize — это ORM-библиотека для приложений на Node.js, которая осуществляет сопоставление таблиц в бд и отношений между ними с классами. При использовании Sequelize мы можем не писать SQL-запросы, а работать с данными как с обычными объектами. Причем Sequelize может работать с рядом СУБД — MySQL, Postgres, MariaDB, SQLite, MS SQL Server.

Более подробно про работу sequelize можно посмотреть в официальной документации. А в данном случае мы сосредаточимся на основных моментах работы с данными на примере взаимодействия с SQLite, поскольку SQLite не требует установки сервера и поддерживается из коробки.

Вначале установим пакет sequelize.

npm install --save sequelize

Подключение к базе данных

Для подключения к базе данных прежде всего необходимо создать объект Sequelize:

const Sequelize = require("sequelize"); const sequelize = new Sequelize("usersdb2", "root", "123456", < dialect: "mysql", host: "localhost" >);

Для создания объекта sequelize используется функция Sequelize , которая принимает ряд параметров. Количество параметров может различаться в зависимости от используемой системы базы данных. Но в большинстве случаев, в частности, для СУБД, для которых требуется сервер (MySQL, PostgreSQL, MSSQL, Oracle, MariaDB) будут использовать следующие параметры. Первый параметр — имя базы данных. Второй параметр — логин к бд, третий параметр — пароль. Это обязательные параметры.

Кроме того, с помощью четвертого параметра мы можем задать ряд дополнительных опций конфигурации. Четвертый параметр представляет объект, который имеет множество свойств. В данном случае используются только два. Первое свойство — dialect указывает на диалект языка SQL, который используется в запросах — в данном случае «mysql». Второе свойство host представляет адрес, по которому запущен сервер. По умолчанию host имеет значение «localhost», поэтому для подключения к локальной базе данных это свойство в принципе можно не указывать.

Для свойства dialect в зависимости от того, с какой СУБД предстоит работать, могут использоваться следующие значения:

Подключение к sqlite

Для работы с SQLite также должен быть установлен пакет sqlite3 :

npm install --save sqlite3

И при создании объекта Sequelize в параметрах указывается dialect: «sqlite» :

const Sequelize = require("sequelize"); const sequelize = new Sequelize(< dialect: "sqlite", storage: "metanit.db" >);

Кроме того, с помощью параметра storage устанавливается путь к базе данных.

Подключение к mysql

Для работы с MySQL также должен быть установлен пакет mysql2 , работа с котором разбиралась в прошлой главе:

npm install --save mysql2

И при создании объекта Sequelize в параметрах указывается dialect: «mysql» :

const Sequelize = require("sequelize"); const sequelize = new Sequelize("usersdb2", "root", "123456", < dialect: "mysql", host: "localhost" >);

Подключение к mssql

Для работы с MS SQL Server в проекте должен быть установлен пакет tedious :

npm install --save tedious

И при создании объекта Sequelize в параметрах указывается dialect: «mssql» :

const Sequelize = require("sequelize"); const sequelize = new Sequelize("usersdb2", "sa", "123456", < dialect: "mssql", host: "localhost", port: "1433" >);

Кроме диалекта в настройках конфигурации также указывается параметр host — адрес сервера и port . Если сервер запущен на порту 1433, то в принципе его необязательно указывать, так как этот порт Sequelize использует по умолчанию. Любой другой порт необходимо указывать.

При создании подключения к MSSQL Server мы можем столкнуться с рядом сложностей, которые вытекают в основном из конфигурации самого сервера. Прежде всего, нам надо убедиться, что запущенный экземпляр сервера принимает запросы по TCP. Для этого перейдем в панели управления к пункту Администрирование и затем выберем пункт Управление компьютером

Настройка MS SQL Server для Sequelize

В открывшейся вкладке перейдем к пункту Службы и приложения -> SQL Server Configuration Manager -> SQL Server Network Configuration и найдем нужный нам экземпляр сервера. Убедимся, что для включен параметр TCP/IP (то есть имеет значение «Enabled»).

Настройка порта MS SQL Server для Sequelize

Для использования логина и пароля в MS SQL Server убедимся, что он настроен на смешанную аутентификацию. Для этого подключимся к серверу через SQL Server Managemen Studio и перейдем к свойствам сервера:

Настройка логина и пароля MS SQL Server для Sequelize

Затем в открывшемся окне на вкладке Security выбрем режим SQL Server and Windows Authentication mode .

Windows Authentication for MS SQL Server in Sequelize

После применения всех настроек перезапустим сервер.

И естественно перед подключением необходимо создать базу данных, с которой будет идти взаимодействие.

Подключение к postgres

Для работы с СУБД Postgres также необходимо установить пакет pg :

npm install --save pg

И при создании объекта Sequelize в параметрах указывается dialect: «postgres» :

const Sequelize = require("sequelize"); const sequelize = new Sequelize("usersdb2", "root", "123456", < dialect: "postgres" >);

Все остальное взаимодействие с базой данных в большинстве случаев за некоторыми исключениями практически не зависит от конкретной СУБД. А это значит, что большую часть кода (если не весь код) мы можем использовать для подключения к разным СУБД.

Как получить sql запрос в sequlize

Рассмотим базовые операции с данными на примере модели из прошлой темы:

const Sequelize = require("sequelize"); const sequelize = new Sequelize( < dialect: "sqlite", storage: "metanit.db", 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?

  • Вопрос задан более трёх лет назад
  • 97 просмотров

Комментировать

Решения вопроса 0

Ответы на вопрос 0

Ваш ответ на вопрос

Войдите, чтобы написать ответ

vue

  • Vue.js
  • +4 ещё

Как мне в Supabase сделать что бы мне прилходила не только почта?

  • 1 подписчик
  • 27 янв.
  • 39 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *