Продолжение является основанным на обещаниях node.js orm для Postgres, MySQL, MariaDB, SQLite и Microsoft SQL Server. Он имеет твердую поддержку транзакций, отношения, нетерпеливая и ленивая нагрузка, репликация и многое другое.
Библиотека ORM – это совершенно обычная библиотека, написанная на выбранном вами языке, которая инкапсулирует код, необходимый для манипулирования данными, поэтому вы больше не используете SQL; Вы взаимодействуете напрямую с объектом на том же языке, который вы используете – переполнение стека
Хотя продолжение поддерживает несколько других клиентов базы данных, эта статья посвящена использованию Scentize с Postgres. Мы будем создавать простой блог, где пользователи могут создавать сообщения, просмотреть сообщения и добавлять комментарии к сообщению.
Эта статья разделена на две части:
- Часть первая – продолжение настройки, конфигурации, миграции и посева.
- Часть вторая – выполнение CRUD с продолжением.
Требования
- Nodejs установлены
- NPM или пряжа установлена
Первая часть
Если вы не создали экспресс -проект, быстро сделайте это и откройте проект в терминале. В корневой папке проекта запустите следующие команды для установки необходимых зависимостей:
npm install sequelize sequelize-cli pg pg-hstore
Краткое объяснение библиотек, установленных в вышеуказанной команде:
Продолжение это сама библиотека продолжения.
Squareelize-cli это пакет, который позволяет нам взаимодействовать с базой данных через Продолжение от CLI.
pg Short For Postgres является клиентом Postgres для node.js
pg-hstore это пакет узлов для сериализации и десеризации данных JSON в формате HSTORE.
Далее, давайте создадим Config Servicize, чтобы сделать это, запустите команду ниже, чтобы создать файл с именем . Sequelizerc
touch .sequelizerc
Скопируйте код ниже в .seqluelizerc файл:
const path = require('path')
module.exports = {
config: path.resolve('./database/config', 'config.js'),
'models-path': path.resolve('./database/models'),
'seeders-path': path.resolve('./database/seeders'),
'migrations-path': path.resolve('./database/migrations'),
}
Squestize использует . Sequelizerc Файл для генерации конфигурации и модели с использованием указанного пути.
Далее мы генерируем конфигурацию, выполнив команду ниже:
sequelize init
Теперь у вас должен быть новый каталог под названием База данных С лесами, как показано ниже:
Далее, давайте отредактируем База данных/config/config.js Анкет Замените содержание База данных/config/config.js с кодом ниже:
require('dotenv').config()
module.exports = {
development: {
url: process.env.DEV_DATABASE_URL,
dialect: 'postgres',
},
test: {
url: process.env.TEST_DATABASE_URL,
dialect: 'postgres',
},
production: {
url: process.env.DATABASE_URL,
dialect: 'postgres',
},
}
Поскольку наше внимание сосредоточено на использовании Scentize с Postgres, мы упростили конфигурацию для специфики для Postgres.
Поскольку мы используем Postgres, мы будем использовать строку подключения для подключения к базе данных. Создайте две базы данных Postgres One для разработки и одну для тестирования (если вам нужен тест для вашего проекта).
Как создать строку подключения к базе данных Postgres
Вы можете перейти к следующей части, если вы уже создали базу данных.
Метод 1
Если у вас установлен Postgres локально, следуйте шагам ниже, чтобы создать базу данных и генерировать строку подключения. Откройте терминал и запустите команду ниже:
createdb dev_db -Ucreatedb test_db -U
Строки соединения для приведенных выше баз данных будут:
postgres://: @127.0.0.1:5432/dev_db postgres:// : @127.0.0.1:5432/test_db
Теперь создайте .env Фад и скопируйте фрагмент ниже в него.
DATABASE_URL= DEV_DATABASE_URL=postgres://: @127.0.0.1:5432/dev_db TEST_DATABASE_URL=postgres:// : @127.0.0.1:5432/test_db
Обратите внимание, что если вы используете Heroku для производства, Heroku генерирует строку подключения и введет в переменную среды Database_url Как только вы добавите дополнение Postgres.
Метод 2
Если у вас нет Postgres, установленных локально, вы можете использовать Elephantsql Чтобы создать базы данных.
Создание моделей и миграций
Нам нужно создать модели пользователя, публиковать и комментарии. Для этого запустите следующие команды:
sequelize model:generate --name User --attributes name:string,email:string sequelize model:generate --name Post --attributes title:string,content:text,userId:integer sequelize model:generate --name Comment --attributes postId:integer,comment:text,userId:integer
Каждая из приведенных выше команд будет генерировать миграцию и модель в /база данных/миграции и база данных/модели каталог соответственно.
Примечание , убедитесь, что между -Атрибуты определение.
Например, -Attributes postid: Integer, Comment: Text, userId: Integer выбросит ошибку Ошибка: атрибут '' не может быть проанализирован: не может прочитать свойство «дат данных» неопределенного Из -за пробела между атрибутами.
Затем нам нужно внести несколько изменений в миграции и моделях. Сначала нам нужно добавить Не нулевой Ограничения на Rowerly_key Атрибуты (userid, postid). В первый раз, когда я работал с продолжением, я не знал об этом, и модель, стремящаяся загрузить, не работала. В миграциях редактировать Rowerly_key Атрибуты, как показано ниже:
userId: {
type: Sequelize.INTEGER,
allowNull: false,
},
postId: {
type: Sequelize.INTEGER,
allowNull: false,
},
Редактировать модели/index.js файл следующим образом:
const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const envConfigs = require('../config/config');
const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development';
const config = envConfigs[env];
const db = {};
let sequelize;
if (config.url) {
sequelize = new Sequelize(config.url, config);
} else {
sequelize = new Sequelize(config.database, config.username, config.password, config);
}
fs
.readdirSync(__dirname)
.filter(file => {
return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
})
.forEach(file => {
const model = sequelize['import'](path.join(__dirname, file));
db[model.name] = model;
});
Object.keys(db).forEach(modelName => {
if (db[modelName].associate) {
db[modelName].associate(db);
}
});
db.sequelize = sequelize;
db.Sequelize = Sequelize;
module.exports = db;
//models/index.js
Определение модельных отношений
У нас есть три модели, которые взаимосвязаны как следует
- У пользователя есть много сообщений, и пост принадлежит пользователю (1: N)
- У пользователя много комментариев, и комментарий принадлежит пользователю (1: N)
- В сообщении есть много комментариев, и комментарий принадлежит сообщению (1: n)
Чтобы достичь того, чтобы установить отношения выше программно, давайте отредактируем модели следующим образом:
module.exports = (sequelize, DataTypes) => {
const User = sequelize.define('User', {
name: DataTypes.STRING,
email: DataTypes.STRING
}, {});
User.associate = function(models) {
// associations can be defined here
User.hasMany(models.Post, {
foreignKey: 'userId',
as: 'posts',
onDelete: 'CASCADE',
});
User.hasMany(models.Comment, {
foreignKey: 'userId',
as: 'comments',
onDelete: 'CASCADE',
});
};
return User;
};
// database/models/user.js
module.exports = (sequelize, DataTypes) => {
const Post = sequelize.define('Post', {
title: DataTypes.STRING,
content: DataTypes.TEXT,
userId: DataTypes.INTEGER
}, {});
Post.associate = function(models) {
// associations can be defined here
Post.hasMany(models.Comment, {
foreignKey: 'postId',
as: 'comments',
onDelete: 'CASCADE',
});
Post.belongsTo(models.User, {
foreignKey: 'userId',
as: 'author',
onDelete: 'CASCADE',
})
};
return Post;
};
// database/models/post.js
module.exports = (sequelize, DataTypes) => {
const Comment = sequelize.define('Comment', {
postId: DataTypes.INTEGER,
comment: DataTypes.TEXT,
userId: DataTypes.INTEGER
}, {});
Comment.associate = function(models) {
// associations can be defined here
Comment.belongsTo(models.User, {
foreignKey: 'userId',
as: 'author'
});
Comment.belongsTo(models.Post, {
foreignKey: 'postId',
as: 'post'
});
};
return Comment;
};
// database/models/comment.js
Пришло время запустить миграции, которые переведут миграции в таблицы в базе данных. Бежать
sequelize db:migrate
Если все прошло хорошо, таблицы будут сгенерированы, и мы готовы начать толкать данные в базу данных.
Данные по засеванию в базе данных
Давайте заполним базу данных некоторыми фиктивными данными. Запустите команды ниже, чтобы сгенерировать файлы семян для моделей.
sequelize seed:generate --name User sequelize seed:generate --name Post sequelize seed:generate --name Comment
Приведенные выше команды будут генерировать три файла xxxx-user.js , xxxx-post.js и xxxx-comment.js для Пользователь , Пост и Комментарий модели соответственно.
Измените файлы семян следующим образом:
module.exports = {
up: (queryInterface, Sequelize) => queryInterface.bulkInsert(
'Users',
[
{
name: 'Jane Doe',
email: 'janedoe@example.com',
createdAt: new Date(),
updatedAt: new Date(),
},
{
name: 'Jon Doe',
email: 'jondoe@example.com',
createdAt: new Date(),
updatedAt: new Date(),
},
],
{},
),
down: (queryInterface, Sequelize) => queryInterface.bulkDelete('Users', null, {}),
};
// database/seeds/xxxx-User.js
module.exports = {
up: (queryInterface, Sequelize) =>
queryInterface.bulkInsert(
"Posts",
[
{
userId: 1,
title: "hispotan de nu",
content:
"Nulla mollis molestie lorem. Quisque ut erat. Curabitur gravida nisi at nibh.",
createdAt: new Date(),
updatedAt: new Date()
},
{
userId: 2,
title: 'some dummy title',
content:
"Maecenas tincidunt lacus at velit. Vivamus vel nulla eget eros elementum pellentesque. Quisque porta volutpat erat.",
createdAt: new Date(),
updatedAt: new Date()
}
],
{}
),
down: (queryInterface, Sequelize) =>
queryInterface.bulkDelete("Posts", null, {})
};
// database/seeds/xxxx-Post.js
module.exports = {
up: (queryInterface, Sequelize) =>
queryInterface.bulkInsert(
"Comments",
[
{
userId: 1,
postId: 2,
comment:
"Nulla mollis molestie lorem. Quisque ut erat. Curabitur gravida nisi at nibh.",
createdAt: new Date(),
updatedAt: new Date()
},
{
userId: 2,
postId: 1,
comment:
"Maecenas tincidunt lacus at velit. Vivamus vel nulla eget eros elementum pellentesque. Quisque porta volutpat erat.",
createdAt: new Date(),
updatedAt: new Date()
}
],
{}
),
down: (queryInterface, Sequelize) =>
queryInterface.bulkDelete("Comments", null, {})
};
// database/seeds/xxxx-Comment.js
Теперь запустите команду ниже, чтобы заселить базу данных:
sequelize db:seed:all
Вы можете клонировать полный код для этой статьи здесь
Эй! Вот и сейчас. Во второй части этой статьи я буду создавать эту статью для реализации CRUD для блога. Быть в курсе! 📌
Предлагаемые ресурсы
Эта статья была первоначально опубликована на моем блог
Оригинал: “https://dev.to/nedsoft/getting-started-with-sequelize-and-postgres-emp”