programing

Sequetize.js: 마이그레이션 및 동기화 사용 방법

bestprogram 2023. 7. 26. 22:17

Sequetize.js: 마이그레이션 및 동기화 사용 방법

프로젝트를 시작할 준비가 거의 다 되었습니다.출시 후에는 데이터베이스 구조가 크게 변경될 예정입니다. 기존 테이블의 새 열과 새 테이블의 새 열, 기존 모델과 새 모델의 새 연결 등입니다.

데이터베이스가 변경될 때마다 지워도 상관없는 테스트 데이터만 가지고 있었기 때문에 아직 Sequetize에서 마이그레이션에 손을 대지 않았습니다.

이를위해현제달있다습니리고가재는다있▁to니습▁runningm▁at'이▁i▁that▁present달를을 운영하고 있습니다.sync force: true모델 정의를 변경한 경우 앱이 시작됩니다.이렇게 하면 모든 테이블이 삭제되고 처음부터 다시 만들어집니다.나는 생략할 수 있습니다.force새 테이블만 만들도록 하는 옵션입니다.그러나 기존 시스템이 변경된 경우에는 이 기능이 유용하지 않습니다.

마이그레이션을 추가하면 어떻게 작동합니까? 저는 ( 있는) 테이블이을 원하지 . (데이터가 들어 있는) 테이블은 (으)ㄹ게요.sync force: true그건 불가능해요.앱 배포 절차의 일부로 개발(Laravel 및 기타 프레임워크)하는 데 도움을 준 다른 앱에서는 migrate 명령을 실행하여 보류 중인 마이그레이션을 실행합니다.하지만 이 앱들에서 첫 번째 마이그레이션은 골격 데이터베이스를 가지고 있습니다. 데이터베이스는 개발 초기의 상태입니다. 첫 번째 알파 릴리즈든 뭐든 말이죠.따라서 파티에 대한 애플리케이션 인스턴스도 모든 마이그레이션을 순차적으로 실행하여 한 번에 속도를 높일 수 있습니다.

Sequetize에서 이러한 "첫 번째 마이그레이션"을 생성하려면 어떻게 해야 합니까?만약 내가 마이그레이션을 실행하지 않는다면, 앱의 새로운 인스턴스에는 마이그레이션을 실행할 골격 데이터베이스가 없거나, 시작할 때 동기화가 실행되고 모든 새 테이블 등과 함께 데이터베이스가 새 상태로 만들어지지만, 마이그레이션을 실행하려고 하면 의미가 없습니다.원본 데이터베이스와 각 연속 반복을 염두에 두고 작성되었기 때문입니다.

제 생각은 다음과 같습니다. 모든 단계에서 초기 데이터베이스와 순차적인 각 마이그레이션은 다음과 같은 경우에 생성된 데이터베이스와 같아야 합니다(데이터 추가 또는 빼기).sync force: true 설명이 구조를 입니다.이는 코드의 모델 설명이 데이터베이스 구조를 설명하기 때문입니다.따라서 마이그레이션 테이블이 없는 경우 모든 마이그레이션을 실행하지 않았더라도 동기화를 실행하고 완료된 것으로 표시합니다.이것이 제가 해야 할 일입니까(어떻게?), 아니면 속편화가 스스로 해야 하는 것입니까, 아니면 제가 잘못 알고 있는 것입니까?그리고 제가 올바른 영역에 있다면 이전 모델을 고려할 때 마이그레이션의 대부분을 자동으로 생성할 수 있는 좋은 방법이 있을 것입니다(커밋 해시를 사용하시겠습니까?또는 각 마이그레이션을 커밋에 연결할 수 있습니까?저는 휴대가 불가능한 기트 중심의 우주에서 생각하고 있다는 것을 인정합니다.구조를 변경하고 데이터베이스를 이전 데이터에서 새 데이터로 변환하는 데 필요한 명령을 생성한 다음 개발자가 들어가서 필요한 수정(특정 데이터 삭제/전환 등)을 수행할 수 있습니다.

로 속편 때.--init명령을 실행하면 빈 마이그레이션 디렉토리가 나타납니다.그 다음에 실행할 때sequelize --migrate그것은 나를 속편으로 만듭니다.아무것도 없는 메타 테이블, 다른 테이블이 테이블은 없습니다.분명히 아닙니다. 왜냐하면 그 바이너리는 제 앱을 부트스트랩하고 모델을 로드하는 방법을 모르기 때문입니다.

제가 뭔가를 놓쳤나 봐요.

TLDR: 라이브 앱의 다양한 인스턴스를 최신 상태로 전환할 수 있도록 앱과 마이그레이션을 설정하려면 어떻게 해야 합니까?

"첫 번째 마이그레이션" 생성

여러분의 경우, 가장 신뢰할 수 있는 방법은 거의 수동으로 수행하는 것입니다.저는 sufficiize-cli 도구를 사용할 것을 제안합니다.구문은 상당히 단순합니다.

sequelize init
...
sequelize model:create --name User --attributes first_name:string,last_name:string,bio:text

이렇게 하면 모델과 마이그레이션이 모두 생성됩니다.그런 다음 sufficientize-cli로 생성된 기존 모델을 수동으로 병합하고 마이그레이션에서도 동일하게 수행합니다.이 작업을 수행한 후 데이터베이스를 지우고 실행합니다(가능한 경우).

sequelize db:migrate

스키마 마이그레이션이 생성됩니다.스키마 개발 프로세스(동기화:force는 없지만 권한 있는 마이그레이션은 있음)로 전환하려면 이 작업을 한 번만 수행해야 합니다.

나중에 스키마를 변경해야 할 경우:

  1. 생성:sequelize migration:create
  2. 마이그레이션 파일의 위/아래 기능 쓰기
  3. 마이그레이션 파일의 변경 사항에 따라 모델을 수동으로 변경합니다.
  4. 려달을 합니다.sequelize db:migrate

프로덕션에서 마이그레이션 실행

운영 서버에 SSH를 설치하고 마이그레이션을 직접 실행할 수는 없습니다.Node용 프레임워크 독립적 마이그레이션 도구인 umzug를 사용합니다.JS - 앱을 시작하기 전에 보류 중인 마이그레이션을 수행합니다.

다음과 같은 보류 중/아직 실행되지 않은 마이그레이션 목록을 얻을 수 있습니다.

umzug.pending().then(function (migrations) {
  // "migrations" will be an Array with the names of
  // pending migrations.
}); 

그런 다음 마이그레이션을 실행합니다(내부 콜백).실행 방법은 지정된 모든 마이그레이션에 대해 각 기능을 실행하는 범용 함수입니다.

umzug.execute({
  migrations: ['some-id', 'some-other-id'],
  method: 'up'
}).then(function (migrations) {
  // "migrations" will be an Array of all executed/reverted migrations.
});

그리고 제 제안은 앱이 시작하기 전에 그것을 하고 매번 경로를 제공하려고 노력하는 것입니다.이와 같은 것:

umzug.pending().then(function(migrations) {
    // "migrations" will be an Array with the names of
    // pending migrations.
    umzug.execute({
        migrations: migrations,
        method: 'up'
    }).then(function(migrations) {
        // "migrations" will be an Array of all executed/reverted migrations.
        // start the server
        app.listen(3000);
        // do your stuff
    });
});

지금은 시도할 수 없지만, 처음에는 효과가 있을 겁니다.

UPD 2016년 4월

1년이 지난 지금도 여전히 유용하기 때문에 저의 현재 팁을 공유합니다. 저는 설중입다니치지은을 .sequelize-cli필요한 실시간 종속성으로 패키지화한 다음 NPM 시작 스크립트를 수정합니다.package.json다음과 같이:

...
"scripts": {
  "dev": "grunt && sequelize db:migrate && sequelize db:seed:all && node bin/www",
  "start": "sequelize db:migrate && sequelize db:seed:all && node bin/www"
},
...

할은 운영서서수하야는작업같다다습니음과은행버입니다.npm start이 명령은 모든 마이그레이션을 실행하고 모든 시드기를 적용하고 앱 서버를 시작합니다.수동으로 umzug를 호출할 필요가 없습니다.

제가 직접 배운 것입니다. 하지만 이제 마이그레이션을 사용하여 익숙해질 것을 권장합니다.마이그레이션에서 사용되는 작업을 파악하는 데 가장 좋은 방법은 생성된 테이블의 SQL을 보는 것입니다.sequelize.sync()거기서 마이그레이션을 구축합니다.

migrations -c [migration name] 

템플릿 마이그레이션 파일을 마이그레이션 디렉토리에 만듭니다.그런 다음 작성해야 하는 필드를 채울 수 있습니다.에는 이파은다포합니다야를 포함해야 .createdAt/updatedAt협회 등에 필요한 분야

초기 테이블 생성 시 아래쪽은 다음과 같아야 합니다.

migration.dropTable('MyTable');

그러나 이후에 테이블 구조를 업데이트하면 이 문제를 제외하고 다른 테이블만 사용할 수 있습니다.

./node_modules/.bin/sequelize --migrate

생성 예는 다음과 같습니다.

module.exports = {
  up: function(migration, DataTypes, done) {
    migration.createTable(
        'MyTable',
        {
          id: {
            type: DataTypes.INTEGER,
            primaryKey: true,
            autoIncrement: true
          },
          bigString: {type: DataTypes.TEXT, allowNull: false},
          MyOtherTableId: DataTypes.INTEGER,
          createdAt: {
            type: DataTypes.DATE
          },
          updatedAt: {
            type: DataTypes.DATE
          }
        });
    done();
  },
  down: function(migration, DataTypes, done) {
    migration.dropTable('MyTable');
    done();
  }

처음부터 다시 실행하는 방법:

./node_modules/.bin/sequelize --migrate --undo
./node_modules/.bin/sequelize --migrate

커피를 사용하여 시드 파일을 실행하여 테이블을 채우는 중입니다.

coffee server/seed.coffee

이 기능에는 다음과 같은 생성 기능이 있습니다.

user = db.User.create
  username: 'bob'
  password: 'suruncle'
  email: 'bob@bob.com'
.success (user) ->
  console.log 'added user'
  user_id = user.id
  myTable = [
    field1: 'womp'
    field2: 'rat'

    subModel: [
      field1: 'womp'
     ,
      field1: 'rat'
    ]
  ]

말고 가세요.sync()모델의 인덱스가 맞지 않으면 마이그레이션 및 시드 작업을 덮어씁니다.

물론 문서는 http://sequelize.readthedocs.org/en/latest/docs/migrations/ 에 있습니다.하지만 기본적인 대답은 필요한 필드를 지정하기 위해 자신의 모든 것을 추가해야 한다는 것입니다.그것은 당신에게 도움이 되지 않습니다.

개발을 위해 구조를 변경하여 현재 테이블을 동기화하는 옵션이 있습니다.속편 github repo의 최신 버전을 사용하여 이제 동기화를 실행할 수 있습니다.alter 명령어

Table.sync({alter: true})

문서의 주의 사항:

모형에 맞게 표를 변경합니다.프로덕션용으로는 권장되지 않습니다.모델에서 제거되었거나 유형이 변경된 열의 데이터를 삭제합니다.

저는 이 게시물과 비슷한 질문들을 살펴보았지만, 그것은 저에게 별로 답이 되지 않았습니다.마이그레이션은 로컬 데이터베이스를 가동하고 운영 중인 데이터를 업데이트하는 데 유용합니다.

저는 여기서 질문을 하고 대답도 했습니다.후속 마이그레이션 및 초기화를 처리하기 위한 워크플로우?

그린필드 프로젝트의 TL-DR 버전

  1. 기존에 순수 SQL 스크립트를 사용하던 방식으로 데이터베이스 스키마를 설계하거나 GUI 도구를 사용하는 경우
  2. 하면 DB 하여 속편으로 합니다..sql줄을 지어 넘기다
  3. 첫 번째 마이그레이션을 수행합니다. 실행sequelize init:migrate의 원는폴저수있습다니장이 있는 에나.models에 있습니다.
  4. 첫 번째 마이그레이션 파일을 만듭니다. 실행sequelize migration:generate --name [name_of_your_migration]
  5. 그 마이그레이션 파일에 이 코드를 넣으십시오.
("use strict");
/**
 * DROP SCHEMA public CASCADE; CREATE SCHEMA public
 * ^ there's a schema file with all the tables in there. it drops all of that, recreates
 */
const fs = require("fs");
const initialSqlScript = fs.readFileSync("./migrations/sql/Production001.sql", {
  encoding: "utf-8",
});
const db = require("../models");
module.exports = {
  up: () => db.sequelize.query(initialSqlScript),
  down: () =>
    db.sequelize.query(`DROP SCHEMA public CASCADE; CREATE SCHEMA public;
`),
};

enter image description here

이 일반적인 폴더 구조로

enter image description here

  1. 이제 후속 설정이 초기 데이터베이스 스키마와 동기화됩니다.
  2. 스키마를 실행합니다.sequelize migration:generate --name [name_of_your_migration]
  3. 기에서시오에서 하십시오.up그리고.down마이그레이션 경로. 이름, 열 ALTER 입니다.
  4. 려달을 합니다.sequelize db:migrate
  5. 할 수 있는 은 원의 DB 변사모동하기기원를입니다.npm install sequelize-auto.
  6. 데이터베이스의 현재 데이터베이스 스키마를 읽고 모델 파일을 자동으로 생성합니다.이와 합니다.sequelize-auto -o "./models" -d sequelize_auto_test -h localhost -u my_username -p 5432 -x my_password -e postgreshttps://github.com/sequelize/sequelize-auto 에서 찾을 수 있습니다.

를 확인할 수 . 모델의 사항을 . git의 difflog 파일입니다. 데이터베이스 모델의 변경 사항을 반영하는 변경 사항만 있어야 합니다., 절하지마십오시정고대▁the를 절대 수정하지 마세요.modelssequelize auto이것이 당신을 위해 그것들을 생성할 것이기 때문입니다.파일을 하여 데이터베이스 수정하지 . SQL 파일을 수 이 하면 됩니다. SQL 파일을 가져올 수 있는 옵션입니다..sql파일도 마찬가지입니다.

이제 데이터베이스 스키마가 최신이며, 데이터베이스 마이그레이션만 후속 작업으로 전환되었습니다.

모든 것이 버전으로 제어됩니다.데이터베이스 및 백엔드 개발자에게 이상적인 워크플로우입니다.

이제 새로운 속편 마이그레이션은 매우 간단합니다.

이것이 여러분이 할 수 있는 일의 예입니다.

    'use strict';

    var Promise = require('bluebird'),
        fs = require('fs');

    module.exports = {
        up: function (queryInterface, Sequelize) {

            return Promise
                .resolve()
                .then(function() {
                    return fs.readFileSync(__dirname + '/../initial-db.sql', 'utf-8');
                })
                .then(function (initialSchema) {
                    return queryInterface.sequelize.query(initialSchema);
                })
        },

        down: function (queryInterface, Sequelize) {
            return Promise
                .resolve()
                .then(function() {
                    return fs.readFileSync(__dirname + '/../drop-initial-db.sql', 'utf-8');
                })
                .then(function (dropSql) {
                    return queryInterface.sequelize.query(dropSql);
                });
        }
    };

다음을 설정해야 합니다.

"dialectOptions": { "multipleStatements": true }

데이터베이스 구성에서.

버전을 사용합니다.응용프로그램의 버전은 데이터베이스의 버전에 따라 다릅니다.새 버전에서 데이터베이스 업데이트가 필요한 경우 해당 버전에 대한 마이그레이션을 작성합니다.

update: 필요할 때 마이그레이션(KISS)을 포기하고 스크립트 update_db(sync forse: false)를 실행하기로 결정했습니다.

Sequelize는 임의 SQL을 비동기적으로 실행할 수 있습니다.

제가 해야 할 일은 다음과 같습니다.

  • 마이그레이션 생성(첫 번째 마이그레이션으로 사용);
  • 덤프합니다. 것은 다음과 같습니다.mysql_dump -uUSER -pPASS DBNAME > FILE.SQL
  • 전체 덤프를 텍스트(위험)로 붙여넣거나 전체 덤프가 포함된 파일을 노드:
    • var baseSQL = "LOTS OF SQL and it's EVIL because you gotta put \ backslashes before line breakes and \"quotes\" and/or sum" + " one string for each line, or everything will break";
    • var baseSQL = fs.readFileSync('../seed/baseDump.sql');
  • 마이그레이션 후속 작업에서 이 덤프 실행:
module.exports = {
  up: function (migration, DataTypes) {
    var baseSQL = "whatever" // I recommend loading a file
    migration.migrator.sequelize.query(baseSQL);
  }
}

비동기식이 문제가 될 수도 있지만 데이터베이스 설정을 처리해야 합니다.만약 그렇게 된다면, 저는 반품을 연기할 방법을 찾을 것입니다.up는 비동기식이 될 까지 계속됩니다.query기능이 종료되었습니다.

mysql_messages에 대한 자세한 내용은 http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html
후속 마이그레이션에 대해 자세히 알아보기: http://sequelize.readthedocs.org/en/latest/docs/migrations/
Sequetize Migration 내에서 SQL을 실행하는 방법에 대해 자세히 알아보기: https://github.com/sequelize/sequelize/issues/313

조금 늦었고 설명서를 읽은 후에는 지금 말씀하신 첫 번째 마이그레이션을 수행할 필요가 없습니다.당신이 해야 할 일은 전화하는 것뿐입니다.sync테이블을 만들기 위해.

sequelize.sync()

다음과 같은 작업을 수행하여 간단한 모델 동기화를 실행할 수도 있습니다.

Project.sync()하지만 제 생각엔sequelize.sync()는 프로젝트에 더 유용한 일반적인 경우입니다(시작할 때 좋은 모델을 가져오는 경우).

(http://sequelizejs.com/docs/latest/models#database-synchronization) 참조)

이렇게 하면 모든 초기 구조가 만들어집니다.이후에는 스키마를 발전시키기 위해 마이그레이션만 생성하면 됩니다.

도움이 되길 바랍니다.

다음은 현재 워크플로우입니다.저는 제안을 받아들일 수 있습니다.

  1. 존재하지 않는 테이블을 만들기 위해 속편 설정
  2. 후속 작업을 삭제하도록 설정하고 _blank라는 빈 데이터베이스에 모든 테이블을 다시 만듭니다.
  3. mysql 도구를 사용하여 _blank를 비교하고 해당 도구를 사용하여 변경사항을 동기화합니다.여전히 Mac에서 이 기능을 수행할 수 있는 저렴한 도구를 찾고 있습니다.MySql 워크벤치는 기존 스키마에서 모델을 가져온 다음 스키마를 동기화할 수 있습니다.쉽게 하기 위해 명령줄을 통해 이 작업을 수행하는 방법을 알아봅니다.

이렇게 하면 마이그레이션 표를 수동으로 업데이트할 필요가 없고 손가락이 굵은 것에 대해 걱정할 필요가 없지만 ORM이 표시됩니다.

친구 나도 같은 질문을 했고 그것들을 사용하는 방법을 이해할 수 있었습니다.

저는 ORM 속편 없이 시작했기 때문에 이미 데이터 모델을 가지고 있었습니다.
저는 sufficialize-auto로 모델을 자동으로 생성해야 했고, 당신이 https://gist.github.com/ahelord/a7a7d293695b71aadf04157f0f7dee64 을 만들고 동기화하는 이 파일로 마이그레이션을 생성해야 했습니다.{Force: false})
이것은 개발 중입니다.모델과 마이그레이션을 버전화해 코드를 풀 때마다 실행해야 합니다.

운영 환경에서는 서버가 2층에만 있으므로 마이그레이션만 실행하고 백엔드를 중지하지 않고 모델을 버전화할 때마다 관리해야 합니다.

더 간단한 방법이 있습니다(Sequalize를 피함).이는 다음과 같습니다.

  1. 프로젝트 내부에 명령을 입력합니다. npm run migrate: new

  2. 이렇게 하면 3개의 파일이 생성됩니다.js 파일 및 이름이 up/down인 두 개의 sql 파일

  3. 당신은 그 파일들에 당신의 SQL 문을 넣었습니다, 그것은 순수한 sql입니다.
  4. 그런 다음 npm run migrate:up 또는 npm run migrate:down을 입력합니다.

이 기능이 작동하려면 db-migrate 모듈을 확인하십시오.

일단 설정이 완료되면(이는 어렵지 않습니다), DB를 변경하는 것은 정말 쉽고 많은 시간을 절약할 수 있습니다.

마이그레이션을 실행해야 했습니다.db.sync 제가 테스트를 제가 있던 를 미리 입니다.globalSetup

그리고 나서, 저는 그것을 해결했습니다.execSync:

const { db } = require('./db'); 
const { execSync } = require("child_process"); 

module.exports = async (globalConfig, projectConfig) => {
  await db.authenticate()  
  await db.sync({ force: true });
  execSync(`sequelize-cli db:migrate`, {stdio: 'inherit'}) // migrate
  execSync(`sequelize-cli db:seed:all`, {stdio: 'inherit'}) // seed
};

언급URL : https://stackoverflow.com/questions/21105748/sequelize-js-how-to-use-migrations-and-sync