Рубрики
Без рубрики

Начало работы с продолжением и Postgres

Squareelize-это Node.js Orm для ORM для Postgres, MySQL, MariaDB, SQLite и Microsoft SQL. Tagged с узлом, Express, JavaScript, Postgres.

Продолжение является основанным на обещаниях 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 -U 
createdb 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”