Как использовать тип данных BLOB с последовательными миграциями - PullRequest
0 голосов
/ 18 марта 2020

Я недавно начал использовать nodejs и выполнял секвализацию, и я разрабатывал пример приложения. В моем приложении у меня есть пользователи. При добавлении некоторых фиктивных данных с использованием сеялок в sequalize я столкнулся с этой проблемой, связанной с тем, как добавить изображение профиля, имеющее тип BLOB, с использованием сеялок.

Мой образец модели и исходный файл, как показано ниже.

module.exports = (sequelize, DataTypes) => {
  const user = sequelize.define('User', {
    firstName: DataTypes.STRING,
    lastName: DataTypes.STRING,
    fullName: DataTypes.STRING,
    profilePicture: DataTypes.BLOB
  }, {});
  user.associate = function(models) {
    // associations can be defined here
  };
  return user;
};

'use strict';

module.exports = {
  up: (queryInterface, Sequelize) => {
    /*
      Add altering commands here.
      Return a promise to correctly handle asynchronicity.

      Example:
      return queryInterface.bulkInsert('People', [{
        name: 'John Doe',
        isBetaMember: false
      }], {});
    */
    return queryInterface.bulkInsert('users', [
      {
        firstName: 'Andrew',
        lastName: 'Perera',
        fullName: 'Andrew Perera',
        createdAt: new Date(),
        updatedAt: new Date(),
        profilePicture: <WHAT IS THIS>
      }
      ]);
  },

  down: (queryInterface, Sequelize) => {
    /*
      Add reverting commands here.
      Return a promise to correctly handle asynchronicity.

      Example:
      return queryInterface.bulkDelete('People', null, {});
    */
    return queryInterface.bulkDelete('users', null, {});
  }
};

Как мне это сделать?

1 Ответ

0 голосов
/ 19 марта 2020

Вы можете присвоить ему значение buffer. В приведенном ниже примере используется "sequelize": "^5.21.3".

. Для реальной ситуации вы можете создать буфер следующим образом:

import fs from 'fs';
const filepath = path.resolve(__dirname, './image.jpeg');
const profilePicture = Buffer.from(fs.readFileSync(filepath));

И записать эти данные BLOB в файл изображения:

import fs from 'fs';
const outputFilepath = path.resolve(__dirname, './output.jpeg');
fs.writeFileSync(outputFilepath, user.profilePicture, 'base64');
import { sequelize } from '../../db';
import { Model, DataTypes } from 'sequelize';

class User extends Model {}
User.init(
  {
    firstName: DataTypes.STRING,
    lastName: DataTypes.STRING,
    fullName: DataTypes.STRING,
    profilePicture: DataTypes.BLOB,
  },
  { sequelize, modelName: 'users', timestamps: true },
);

(async function test() {
  try {
    await sequelize.sync({ force: true });
    // seed
    await User.bulkCreate([
      {
        firstName: 'Andrew',
        lastName: 'Perera',
        fullName: 'Andrew Perera',
        createdAt: new Date(),
        updatedAt: new Date(),
        profilePicture: Buffer.from('whatever'),
      },
    ]);
    const user = await User.findOne();
    console.log('user:', user);
  } catch (error) {
    console.log(error);
  } finally {
    await sequelize.close();
  }
})();

Результаты выполнения:

Executing (default): INSERT INTO "users" ("id","firstName","lastName","fullName","profilePicture","createdAt","updatedAt") VALUES (DEFAULT,'Andrew','Perera','Andrew Perera',E'\\x7768617465766572','2020-03-19 04:14:20.981 +00:00','2020-03-19 04:14:20.981 +00:00') RETURNING *;
Executing (default): SELECT "id", "firstName", "lastName", "fullName", "profilePicture", "createdAt", "updatedAt" FROM "users" AS "users" LIMIT 1;
user: { id: 1,
  firstName: 'Andrew',
  lastName: 'Perera',
  fullName: 'Andrew Perera',
  profilePicture: <Buffer 77 68 61 74 65 76 65 72>,
  createdAt: 2020-03-19T04:14:20.981Z,
  updatedAt: 2020-03-19T04:14:20.981Z 

фиктивные записи данных в базе данных:

=# select * from users;
 id | firstName | lastName |   fullName    | profilePicture |         createdAt          |         updatedAt
----+-----------+----------+---------------+----------------+----------------------------+----------------------------
  1 | Andrew    | Perera   | Andrew Perera | \x706963       | 2020-03-19 04:11:55.868+00 | 2020-03-19 04:11:55.868+00
(1 row)
...