Как создать базу данных mysql с помощью sequelize (nodejs)

Я пытаюсь максимально автоматизировать процесс создания БД и таблиц. Можно ли создать базу данных через sequelize? Могу ли я создать строку подключения, которая соединяется только с сервером, а не с БД напрямую?

4 ответа

Решение

Краткий ответ: Конечно, вы можете!

Вот как я это сделал:

//create the sequelize instance, omitting the database-name arg
const sequelize = new Sequelize("", "<db_user>", "<db_password>", {
  dialect: "<dialect>"
});

return sequelize.query("CREATE DATABASE `<database_name>`;").then(data 
=> {
  // code to run after successful creation.
});

PS Где разместить код будет зависеть от ваших потребностей. Внутри исходный файл миграции работал для меня.

Вот основные шаги для заполнения таблиц mySql модулями sequelize и sequelize-fixtures:

Шаг 1: создание модели

module.exports = function(sequelize, Sequelize) {
// Sequelize user model is initialized earlier as User
const User = sequelize.define('user', {
    id          :       { type: Sequelize.INTEGER, autoIncrement: true, primaryKey: true },
    firstname   :       { type: Sequelize.STRING },
    lastname    :       { type: Sequelize.STRING },
    email       :       { type: Sequelize.STRING, validate: {isEmail:true} },
    password    :       { type: Sequelize.STRING }, 
});

// User.drop();
return User;
}

Шаг 2: создание файла конфигурации для хранения настроек базы данных

{
  "development": {

    "username": "root",
    "password": null,
    "database": "hotsausemedia",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "test": { 
    "username": "",
    "password": null,
    "database": "hotsausemedia",
    "host": "",
    "dialect": "mysql"
  },
  "production": {
    "username": "",
    "password": null,
    "database": "hotsausemedia",
    "host": "127.0.0.1",
    "dialect": "mysql"
  }
}

Шаг 3: создание sequelize-fixture для заполнения таблиц. Вот пример файла JSON для использования для заполнения данных

[
    {
        "model": "product",
        "keys": ["id"],
        "data": {
            "id": 1,
            "name": "Product #1",
            "src": "./assets/img/products/01.jpg",
            "price": 9.99,
            "desc": "Product description..."
        }
    },
    {
        "model": "product",
        "keys": ["id"],
        "data": {
            "id": 2,
            "name": "Product #2",
            "src": "./assets/img/products/02.jpg",
            "price": 19.99,
            "desc": "Product description..."
        }
    },
    ...

]

шаг 4: подключение к базе данных и заполнение таблиц

models.sequelize.sync().then(() => {
    console.log('You are connected to the database successfully.');
    sequelize_fixtures.loadFile('./fixtures/*.json', models).then(() =>{
        console.log("database is updated!");
   });
   }).catch((err) => {
       console.log(err,"Some problems with database connection!!!");
});

Ни одно из решений не сработало для меня для синхронизации базы данных и модели. Вдохновленный ответом osifo, я решил его, используя хук beforeConnect для продолжения, как показано ниже:

      const env = process.env.NODE_ENV || 'development';
const config = require(__dirname + '/../config/config.json')[env];

const { host, port, username, password } = config;

# create sequelize instance without providing db name in config
sequelize = new Sequelize('', username, password, config);

sequelize.beforeConnect(async (config) => {
     const connection = await mysql.createConnection({ host: host, port: port, user: username, password: password });
     await connection.query(`CREATE DATABASE IF NOT EXISTS \`${process.env.DB_NAME}\`;`);
     config.database = process.env.DB_NAME;
});

Файл config.json содержит конфигурации для разных баз данных, таких как

      {
  "development": {
    "username": "root",
    "password": "init@123",
    "host": "mysqldb",
    "dialect": "mysql"
  },
  "test": {
    "username": "root",
    "password": null,
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "production": {
    "username": "root",
    "password": null,
    "host": "127.0.0.1",
    "dialect": "mysql",
  }
}

Имя базы данных предоставляется после подключения к базе данных и создания (при необходимости) в хуке сиквела перед подключением.

Несмотря на то, что на этот вопрос недавно был дан ответ, взгляните на этот другой ответ (мой) из очень похожего вопроса (возможно, дубликата?), Который определенно применяется здесь: /questions/49597129/sequelize-js-sozdat-novuyu-bazu-dannyih-esli-ee-ne-suschestvuet/55445323#55445323

Идея состоит в том, чтобы использовать Sequelize Migrations, где вы позволяете Sequelize обрабатывать миграции с использованием файлов в этом формате:

      module.exports = {
  up: (queryInterface, Sequelize) => {
    // logic for transforming into the new state
  },
  down: (queryInterface, Sequelize) => {
    // logic for reverting the changes
  }

Да, откаты тоже обрабатываются. Делает этот процесс очень простым для автоматизации.

Другие вопросы по тегам