Sequelize.js: cách sử dụng di chuyển và đồng bộ hóa


137

Tôi sắp hoàn thành dự án của mình. Tôi có kế hoạch lớn cho sau khi khởi chạy và cấu trúc cơ sở dữ liệu sẽ thay đổi - các cột mới trong các bảng hiện có cũng như các bảng mới và các liên kết mới với các mô hình mới và hiện có.

Tôi chưa chạm vào di chuyển trong Sequelize, vì tôi chỉ có dữ liệu thử nghiệm mà tôi không ngại xóa sạch mỗi khi cơ sở dữ liệu thay đổi.

Cuối cùng, hiện tại tôi đang chạy sync force: truekhi ứng dụng của tôi khởi động, nếu tôi đã thay đổi định nghĩa mô hình. Điều này xóa tất cả các bảng và làm cho chúng từ đầu. Tôi có thể bỏ qua forcetùy chọn để chỉ tạo các bảng mới. Nhưng nếu những cái hiện có đã thay đổi thì điều này không hữu ích.

Vì vậy, một khi tôi thêm vào di chuyển, làm thế nào để mọi thứ hoạt động? Rõ ràng tôi không muốn các bảng hiện có (có dữ liệu trong đó) bị xóa sạch, vì vậy sync force: truekhông có vấn đề gì. Trên các ứng dụng khác, tôi đã giúp phát triển (Laravel và các khung công tác khác) như một phần của quy trình triển khai ứng dụng, chúng tôi chạy lệnh di chuyển để chạy mọi di chuyển đang chờ xử lý. Nhưng trong các ứng dụng này, lần di chuyển đầu tiên có cơ sở dữ liệu bộ xương, với cơ sở dữ liệu ở trạng thái sớm phát triển - phiên bản alpha đầu tiên hoặc bất cứ điều gì. Vì vậy, ngay cả một phiên bản của ứng dụng muộn cho bữa tiệc cũng có thể tăng tốc trong một lần, bằng cách chạy tất cả các lần di chuyển theo trình tự.

Làm cách nào để tạo "di chuyển đầu tiên" như vậy trong Sequelize? Nếu tôi không có, một phiên bản mới của ứng dụng theo cách nào đó sẽ không có cơ sở dữ liệu bộ xương để chạy di chuyển hoặc nó sẽ chạy đồng bộ hóa khi bắt đầu và sẽ làm cho cơ sở dữ liệu ở trạng thái mới với tất cả các bảng mới, v.v., nhưng sau đó khi nó cố gắng chạy các di chuyển, chúng sẽ không có ý nghĩa, vì chúng được viết với cơ sở dữ liệu ban đầu và mỗi lần lặp lại liên tiếp trong tâm trí.

Quá trình suy nghĩ của tôi: ở mọi giai đoạn, cơ sở dữ liệu ban đầu cộng với mỗi lần di chuyển theo trình tự sẽ bằng (cộng hoặc trừ dữ liệu) cơ sở dữ liệu được tạo khi sync force: truechạy. Điều này là do các mô tả mô hình trong mã mô tả cấu trúc cơ sở dữ liệu. Vì vậy, có thể nếu không có bảng di chuyển, chúng tôi chỉ chạy đồng bộ hóa và đánh dấu tất cả các lần di chuyển là xong, mặc dù chúng không chạy. Đây có phải là những gì tôi cần làm (làm thế nào?), Hoặc là Sequelize phải tự làm điều này, hay tôi đang sủa sai cây? Và nếu tôi ở đúng khu vực, chắc chắn sẽ có một cách hay để tự động tạo ra hầu hết việc di chuyển, dựa trên các mô hình cũ (bằng cách băm xác thực? Hoặc thậm chí mỗi lần di chuyển có thể được gắn với một cam kết không? Tôi thừa nhận tôi đang nghĩ trong một vũ trụ trung tâm không di động) và các mô hình mới. Nó có thể làm khác cấu trúc và tạo các lệnh cần thiết để chuyển đổi cơ sở dữ liệu từ cũ sang mới và sau đó, nhà phát triển có thể đi vào và thực hiện bất kỳ chỉnh sửa cần thiết nào (xóa / chuyển dữ liệu cụ thể, v.v.).

Khi tôi chạy nhị phân tuần tự với --initlệnh, nó sẽ cho tôi một thư mục di chuyển trống. Khi tôi chạy sequelize --migratenó làm cho tôi một bảng SequelizeMeta không có gì trong đó, không có bảng nào khác. Rõ ràng là không, bởi vì nhị phân đó không biết cách khởi động ứng dụng của tôi và tải các mô hình.

Chắc chắn là tôi đang thiếu gì đó.

TLDR: làm cách nào để thiết lập ứng dụng của tôi và quá trình di chuyển của nó để có thể cập nhật các phiên bản khác nhau của ứng dụng trực tiếp, cũng như một ứng dụng hoàn toàn mới không có cơ sở dữ liệu bắt đầu?


2
Tôi đã trả lời liên quan đến quy trình công việc của bạn, nhưng lý tưởng nhất là tất cả các Bảng nên được thiết lập bằng Di chuyển. Ngay cả khi bạn đang sử dụng syncbây giờ, ý tưởng là việc di chuyển "tạo ra" toàn bộ cơ sở dữ liệu, do đó việc dựa vào bộ xương là một vấn đề. Chẳng hạn, quy trình làm việc của Ruby on Rails, sử dụng Di chuyển cho mọi thứ và thật tuyệt vời khi bạn đã quen với nó. Chỉnh sửa: Và vâng, tôi nhận thấy câu hỏi này khá cũ, nhưng vì chưa bao giờ có câu trả lời thỏa đáng và mọi người có thể đến đây để tìm hướng dẫn, tôi nghĩ rằng tôi nên đóng góp.
Fernando Cordeiro

Câu trả lời:


88

Tạo "di chuyển đầu tiên"

Trong trường hợp của bạn, cách đáng tin cậy nhất là làm nó gần như bằng tay. Tôi sẽ đề nghị sử dụng công cụ sequelize-cli . Cú pháp khá đơn giản:

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

Điều này sẽ tạo ra cả mô hình VÀ di chuyển. Sau đó, hợp nhất thủ công các mô hình hiện tại của bạn với được tạo bằng sequelize-cli và thực hiện tương tự với các lần di chuyển. Sau khi làm điều này, xóa cơ sở dữ liệu (nếu có thể) và chạy

sequelize db:migrate

Điều này sẽ tạo ra lược đồ sẽ di chuyển. Bạn chỉ nên làm điều này một lần để chuyển sang quy trình phát triển lược đồ phù hợp (không đồng bộ hóa: lực lượng, nhưng với việc di chuyển có thẩm quyền).

Sau này, khi bạn cần thay đổi lược đồ:

  1. Tạo một di chuyển: sequelize migration:create
  2. Viết các chức năng lên và xuống trong tệp di chuyển của bạn
  3. Theo các thay đổi của bạn trong tệp di chuyển, hãy thay đổi mô hình của bạn theo cách thủ công
  4. Chạy sequelize db:migrate

Chạy di chuyển trên sản xuất

Rõ ràng bạn không thể ssh đến máy chủ sản xuất và chạy di chuyển bằng tay. Sử dụng umzug , công cụ di chuyển không theo khuôn khổ cho Node.JS để thực hiện di chuyển đang chờ xử lý trước khi ứng dụng bắt đầu.

Bạn có thể nhận được một danh sách các di chuyển đang chờ xử lý / chưa được thực hiện như thế này:

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

Sau đó thực hiện di chuyển ( bên trong gọi lại ). Phương thức thực hiện là một hàm mục đích chung chạy cho mỗi lần di chuyển được chỉ định của hàm tương ứng:

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

Và đề nghị của tôi là làm điều đó trước khi ứng dụng bắt đầu và cố gắng phục vụ các tuyến đường mỗi lần. Một cái gì đó như thế này:

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
    });
});

Tôi không thể thử điều này ngay bây giờ, nhưng thoạt nhìn nó sẽ hoạt động.

CẬP NHẬT tháng 4 năm 2016

Sau một năm, vẫn hữu ích, vì vậy chia sẻ lời khuyên hiện tại của tôi. Hiện tại, tôi đang cài đặt sequelize-cligói theo yêu cầu phụ thuộc trực tiếp và sau đó sửa đổi các tập lệnh khởi động NPM package.jsonnhư sau:

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

Điều duy nhất tôi cần làm trên máy chủ sản xuất là npm start. Lệnh này sẽ chạy tất cả các di chuyển, áp dụng tất cả các seeder và khởi động máy chủ ứng dụng. Không cần phải gọi umzug bằng tay.


3
Điều này nghe có vẻ như những gì tôi đang tìm kiếm. Nó không có vẻ kỳ diệu và tự động như nó "nên", nhưng có lẽ đây là điều tốt nhất có thể hy vọng. Tuy nhiên, hiện tại tôi không làm việc với Sequelize và sẽ không thể kiểm tra điều này sớm. Nhưng nếu bất cứ ai khác đồng ý rằng giải pháp này là tốt, tôi sẽ chấp nhận câu trả lời này. Tôi vẫn thấy hơi buồn khi dường như không có cách nào để tự động thực hiện các chuyển đổi này từ các khác biệt giữa các phiên bản mô hình.
run

4
@tremby khung duy nhất tôi đã sử dụng mà thực sự hiểu các mô hình là Django. Nó phân tích các mô hình và hỏi như "Chà, có vẻ như bạn đã đổi tên trường thành First_name trong Model User. Bạn có muốn tạo di chuyển cho nó không?" Trong Django, nó hoạt động gần như kỳ diệu, các công cụ khác mà tôi đã sử dụng giả định cách tiếp cận di chuyển tương tự mà tôi đã đề cập ở trên: bạn chịu trách nhiệm tự viết di chuyển, hiểu sâu sắc về lĩnh vực nào cần thêm vào thực tế cho trạng thái mô hình hiện tại của bạn
F1nn

2
Bạn có thể thoát khỏi pendingvà sau đó executevà chỉ cần làm umzug.up().then(function (migrations) { app.listen(3000); }). Theo tài liệu umzug, điều này sẽ thực hiện tất cả các di chuyển đang chờ xử lý.
Vinay

Khi bạn hoàn thành việc di chuyển, việc thêm các trường vào lược đồ trong tệp mô hình ban đầu có phổ biến không?
theptrk

@ F1nn Tôi có một câu hỏi về thiết lập của bạn, làm thế nào để bạn xử lý phân cụm ứng dụng và tính khả dụng? Tôi sẽ tích hợp pm2 trong quy trình làm việc của mình và có thể nó không hoạt động đơn giản với các tập lệnh npm.
diosney

17

Chỉ tự học điều này, nhưng tôi nghĩ rằng tôi sẽ khuyên bạn nên sử dụng chuyển đổi ngay bây giờ để bạn quen với chúng. Tôi đã tìm thấy điều tốt nhất để tìm ra những gì diễn ra trong quá trình di chuyển là xem xét sql trên các bảng được tạo bởi sequelize.sync()và sau đó xây dựng các di chuyển từ đó.

migrations -c [migration name] 

Sẽ tạo tệp di chuyển mẫu trong thư mục di chuyển. Sau đó, bạn có thể điền nó với các trường bạn cần tạo. Tập tin này sẽ cần bao gồm createdAt/ updatedAt, các trường cần thiết cho các hiệp hội, v.v.

Để tạo bảng ban đầu xuống nên có:

migration.dropTable('MyTable');

Nhưng các bản cập nhật tiếp theo cho cấu trúc bảng có thể loại bỏ điều này và chỉ sử dụng bảng thay đổi.

./node_modules/.bin/sequelize --migrate

Một ví dụ tạo sẽ giống như:

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();
  }

Để làm lại từ đầu:

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

Tôi đang sử dụng cà phê để chạy tệp hạt giống để điền vào các bảng sau:

coffee server/seed.coffee

Điều này chỉ có một chức năng tạo trong đó trông giống như:

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'
    ]
  ]

Hãy nhớ đưa sync()ra khỏi chỉ mục trong các mô hình của bạn nếu không nó sẽ ghi đè lên những gì di chuyển và hạt giống làm.

Tài liệu có tại http://fterelize.readthedocs.org/en/latest/docs/migations/ tất nhiên. Nhưng câu trả lời cơ bản là bạn phải thêm mọi thứ vào chính mình để chỉ định các lĩnh vực bạn cần. Nó không làm điều đó cho bạn.


5
Tôi đã không hỏi làm thế nào để tạo và chạy di chuyển - như bạn đã chỉ ra, đó là tất cả có sẵn trong tài liệu. Những gì tôi đã hỏi là làm thế nào để sử dụng chúng trong ngữ cảnh của một ứng dụng có thể sử dụng lại, nơi các phiên bản hiện tại cần được cập nhật lên phiên bản cơ sở dữ liệu mới hơn và các phiên bản mới cần cơ sở dữ liệu được tạo từ đầu. Hoặc có lẽ bạn đang trả lời điều đó và nói rằng tôi hoàn toàn không nên sử dụng đồng bộ hóa () và tạo cơ sở dữ liệu ban đầu và tất cả các thay đổi đối với cơ sở dữ liệu đó trong quá trình di chuyển. Có phải đó là những gì bạn đang nói?
run rẩy

1
@tremby Tôi nghĩ đó là những gì anh ấy nói. Bạn có thể sử dụng đồng bộ hóa và xử lý kết quả hoặc bạn có thể tạo tất cả các lần di chuyển theo cách thủ công. Các khung của chúng tôi, theo kiểu Rails-esque, tạo các tệp di chuyển dựa trên lược đồ khác, tôi sẽ YÊU nếu Sequelize sẽ làm điều đó cho tôi. Quá đau đớn để thực hiện di chuyển thủ công ...
bắt đầu từ

Thật đáng tiếc khi sequelize.sync()sau đó bạn không thể có một tập lệnh được tạo để tạo tất cả các bảng cơ sở và chỉ mục làm lần di chuyển đầu tiên của bạn (tương tự như đường ray ' schema.rb.) Sau khi đọc qua điều này, có vẻ như cách tốt nhất của bạn là xuất khẩu lược đồ ban đầu của bạn như sql, sau đó đưa nó vào một exectuyên bố lớn trong lần di chuyển đầu tiên của bạn. Sau đó, từ đó bạn đang chạy các thay đổi gia tăng so với điểm bắt đầu "phiên bản 1.0" đã biết.
thom_nic

11

Để phát triển , giờ đây có một tùy chọn để đồng bộ các bảng hiện tại bằng cách thay đổi cấu trúc của chúng. Sử dụng phiên bản mới nhất từ repo github sequelize , bây giờ bạn có thể chạy đồng bộ hóa với altertham số.

Table.sync({alter: true})

Một cảnh báo từ các tài liệu:

Thay đổi bảng để phù hợp với mô hình. Không khuyến khích sử dụng sản xuất. Xóa dữ liệu trong các cột đã bị xóa hoặc đã thay đổi loại của chúng trong mô hình.


3

Bây giờ với việc di chuyển sequelize mới là rất đơn giản.

Đây là một ví dụ những gì bạn có thể làm.

    '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);
                });
        }
    };

Hãy nhớ rằng bạn phải đặt:

"dialectOptions": { "multipleStatements": true }

trên cấu hình cơ sở dữ liệu.


Không phải điều này chỉ cần thả và tạo lại cơ sở dữ liệu?
TWilly

Tôi nghĩ rằng sử dụng một tệp sql lớn ban đầu không phải là cách được khuyến nghị, vì nó sẽ kết nối bộ điều hợp và cơ sở dữ liệu, nếu không sẽ là cơ sở dữ liệu bất khả tri, vì bạn có thể sử dụng để phát triển sqlite và cho mariadb sản xuất hoặc khác.
diosney

2

Sử dụng phiên bản. Phiên bản của ứng dụng phụ thuộc vào phiên bản của cơ sở dữ liệu. Nếu phiên bản mới yêu cầu cập nhật cơ sở dữ liệu, hãy tạo di chuyển cho nó.

update: Tôi quyết định từ bỏ di chuyển ( KISS ) và chạy script update_db (sync forse: false) khi cần thiết.


Tương tự như câu trả lời của tôi đối với câu trả lời của người dùng1916988, bạn có nói rằng tôi hoàn toàn không nên sử dụng sync()và tôi cần phải viết thủ công các chuyển đổi từ lược đồ của các mô hình phiên bản cũ sang các mô hình của phiên bản mới hơn?
run rẩy

Tôi +1 ed vì cập nhật của bạn. Tôi thực sự nghĩ làm như vậy. Viết tất cả các di chuyển thủ công khi ứng dụng có thể làm điều đó hơi ngu ngốc, vì vậy tôi sẽ chỉ tạo một tập lệnh thủ công chạy ứng dụng một lần và chạy chức năng đồng bộ hóa.
Sallar

2

Hơi muộn một chút và sau khi đọc tài liệu, bạn không cần phải có sự di chuyển đầu tiên mà bạn đang nói đến. Tất cả bạn phải làm là gọisync để tạo các bảng.

sequelize.sync()

Bạn cũng có thể chạy đồng bộ hóa mô hình đơn giản bằng cách thực hiện một số thứ như:

Project.sync() nhưng tôi nghĩ rằng sequelize.sync() là một trường hợp chung hữu ích hơn cho dự án của bạn (miễn là bạn nhập các mô hình tốt vào thời điểm bắt đầu).

(được lấy từ http://fterelizejs.com/docs/latest/models#database-synyncization )

Điều này sẽ tạo ra tất cả cấu trúc ban đầu . Sau đó, bạn sẽ chỉ phải tạo chuyển đổi để phát triển các lược đồ của mình.

hy vọng nó giúp.


7
Tôi không nghĩ rằng bạn đọc bài viết gốc rất kỹ lưỡng, hoặc có lẽ tôi đã không đủ rõ ràng. Tôi nhận thức rõ hơn sequelize.sync()và những gì nó làm.
run rẩy

2

Sequelize có thể chạy SQL tùy ý không đồng bộ .

Những gì tôi sẽ làm là:

  • Tạo một di chuyển (Để sử dụng như di chuyển đầu tiên);
  • Kết xuất cơ sở dữ liệu của bạn, đại loại như: mysql_dump -uUSER -pPASS DBNAME > FILE.SQL
  • Dán kết xuất đầy đủ dưới dạng văn bản (Nguy hiểm) hoặc tải Tệp với kết xuất đầy đủ trong Nút:
    • 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');
  • Chạy kết xuất này trên Sequelize Migration:
module.exports = {
  up: function (migration, DataTypes) {
    var baseSQL = "whatever" // I recommend loading a file
    migration.migrator.sequelize.query(baseSQL);
  }
}

Điều đó sẽ đảm nhiệm việc thiết lập cơ sở dữ liệu, mặc dù điều không đồng bộ có thể trở thành một vấn đề. Nếu điều đó xảy ra, tôi sẽ tìm cách trì hoãn trả lại upchức năng tuần tự hóa cho đến khi querychức năng async kết thúc.

Thông tin thêm về mysql_dump: http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html
thêm về Sequelize Migrations: http://sequelize.readthedocs.org/en/latest/docs/migrations/
thêm về Chạy SQL từ bên trong Di chuyển tuần tự hóa: https://github.com/fterelize/ resultelize/issues/313


1

Đây là quy trình làm việc hiện tại của tôi. Tôi đang mở để đề xuất.

  1. Đặt phần tiếp theo để tạo các bảng không tồn tại
  2. Đặt phần tiếp theo để thả và tạo lại tất cả các bảng trong cơ sở dữ liệu trống có tên _blank
  3. Sử dụng công cụ mysql để so sánh _blank và đồng bộ hóa các thay đổi bằng công cụ đó. Vẫn đang tìm kiếm một công cụ giá cả phải chăng có thể làm điều này trên mac. Bàn làm việc MySql trông giống như bạn có thể nhập một mô hình từ một lược đồ hiện có và sau đó đồng bộ hóa lược đồ. Cố gắng tìm ra cách để làm điều này thông qua dòng lệnh để làm cho nó dễ dàng.

Bằng cách đó, bạn không phải cập nhật bảng di chuyển theo cách thủ công và phải lo lắng về ngón tay mập, nhưng bạn vẫn nhận được ORM.


1

Người bạn tôi có cùng một câu hỏi và quản lý để hiểu làm thế nào để sử dụng chúng.

Tôi đã bắt đầu mà không có ORM tuần tự hóa do đó tôi đã có một mô hình dữ liệu.
Tôi đã phải tạo các mô hình tự động với sequelize-auto và tạo các lần di chuyển của chúng với tệp này mà bạn tạo https://gist.github.com/ahelord/a7a7d293695b71aadf04157f0f7dee64 và đặt đồng bộ hóa ( {Force: false})
Đây sẽ là phiên bản. mô hình và các di chuyển và thực hiện chúng mỗi khi tôi kéo mã.

Trong sản xuất, máy chủ chỉ ở tầng trên, do đó bạn chỉ phải chạy di chuyển và trong mỗi lần quản lý cam kết, bạn sẽ phiên bản mô hình mà không dừng phụ trợ


1

Tôi đã xem qua bài đăng này và những câu hỏi tương tự, nó không thực sự trả lời nó cho tôi. Di chuyển rất hữu ích để quay vòng cơ sở dữ liệu cục bộ và cập nhật dữ liệu trong sản xuất

Tôi đã hỏi câu hỏi ở đây và cũng trả lời nó: Quy trình làm việc để xử lý di chuyển và khởi tạo tuần tự?

Phiên bản TL-DR cho dự án greenfield

  1. Thiết kế lược đồ cơ sở dữ liệu của bạn như bạn thường sử dụng các tập lệnh SQL thuần túy hoặc nếu bạn sử dụng một công cụ gui thay thế
  2. Khi bạn hoàn thành tất cả 95% lược đồ db của mình và bạn hài lòng với nó, hãy tiếp tục và di chuyển nó để sắp xếp lại bằng cách di chuyển toàn bộ .sql tệp qua
  3. Thực hiện di chuyển đầu tiên của bạn. Chạy sequelize init:migratetrong thư mục bất cứ nơi nàomodels đang ở
  4. Tạo tập tin di chuyển đầu tiên của bạn. Chạysequelize migration:generate --name [name_of_your_migration]
  5. Trong tệp di chuyển đó, đặt mã này vào đó
("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;
`),
};

nhập mô tả hình ảnh ở đây

với cấu trúc thư mục chung này

nhập mô tả hình ảnh ở đây

  1. Bây giờ thiết lập tuần tự hóa của bạn được đồng bộ hóa với lược đồ cơ sở dữ liệu ban đầu của bạn
  2. Khi bạn muốn chỉnh sửa lược đồ cơ sở dữ liệu của mình, hãy chạy lại nó sequelize migration:generate --name [name_of_your_migration]
  3. Hãy tiếp tục và thực hiện các sửa đổi của bạn ở đây trên các đường dẫn updowndi chuyển. Đây là các câu lệnh ALTER của bạn để thay đổi tên cột, XÓA, THÊM cột, v.v.
  4. Chạy sequelize db:migrate
  5. Bạn muốn các mô hình được đồng bộ hóa với các thay đổi đối với db từ xa của bạn, vì vậy những gì bạn có thể làm bây giờ là npm install sequelize-auto.
  6. Điều này sẽ đọc lược đồ cơ sở dữ liệu hiện tại trên cơ sở dữ liệu của bạn và tự động tạo các tệp mô hình. Sử dụng một lệnh tương tự như lệnh này sequelize-auto -o "./models" -d sequelize_auto_test -h localhost -u my_username -p 5432 -x my_password -e postgresđược tìm thấy trong https://github.com/fterelize/ resultelize-auto

Bạn có thể sử dụng git để xem difflog trên mô hình của mình, chỉ nên có những thay đổi phản ánh những thay đổi trong mô hình cơ sở dữ liệu. Là một lưu ý phụ, đừng bao giờ sửa đổi modelstrực tiếp nếu bạn sử dụng sequelize auto, vì điều này sẽ tạo ra chúng cho bạn. Tương tự như vậy, bạn không còn phải sửa đổi lược đồ cơ sở dữ liệu của mình trực tiếp bằng các tệp SQL, với điều kiện đây là một tùy chọn vì bạn cũng có thể nhập các .sqltệp đó

Bây giờ lược đồ cơ sở dữ liệu của bạn đã được cập nhật và bạn đã chính thức chuyển sang chỉ sắp xếp lại các lần di chuyển cơ sở dữ liệu.

Tất cả mọi thứ là phiên bản kiểm soát. Đây là quy trình làm việc lý tưởng cho cơ sở dữ liệu và nhà phát triển phụ trợ


0

Thậm chí còn có cách đơn giản hơn (tránh Sequalize). Mà đi như thế này:

  1. Bạn gõ một lệnh bên trong dự án của bạn: npm run di chuyển: new

  2. Điều này tạo ra 3 tập tin. Một tệp js và hai tệp sql được đặt tên lên và xuống

  3. Bạn đặt câu lệnh SQL của bạn trong các tệp đó, đó là sql thuần
  4. Sau đó, bạn gõ: npm run di chuyển: lên hoặc npm chạy di chuyển: xuống

Để làm việc này, vui lòng xem mô-đun db-di chuyển .

Khi bạn đã thiết lập xong (điều này không khó), việc thay đổi DB của bạn thực sự dễ dàng và tiết kiệm rất nhiều thời gian.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.