Sequelize.js: วิธีใช้การย้ายข้อมูลและการซิงค์


142

ฉันใกล้จะมีโครงการของฉันพร้อมที่จะเปิดตัวแล้ว ฉันมีแผนใหญ่สำหรับหลังการเปิดตัวและโครงสร้างฐานข้อมูลกำลังจะเปลี่ยนไป - คอลัมน์ใหม่ในตารางที่มีอยู่รวมถึงตารางใหม่และการเชื่อมโยงใหม่กับโมเดลที่มีอยู่และแบบใหม่

ฉันยังไม่ได้แตะการย้ายข้อมูลใน Sequelize เนื่องจากฉันมีเพียงการทดสอบข้อมูลซึ่งฉันไม่คิดจะลบทุกครั้งที่ฐานข้อมูลเปลี่ยนแปลง

ด้วยเหตุนี้ในตอนนี้ฉันกำลังทำงานsync force: trueเมื่อแอปของฉันเริ่มทำงานหากฉันเปลี่ยนข้อกำหนดของโมเดล การดำเนินการนี้จะลบตารางทั้งหมดและสร้างขึ้นใหม่ตั้งแต่ต้น ฉันสามารถละเว้นforceตัวเลือกเพื่อให้สร้างตารางใหม่เท่านั้น แต่ถ้าสิ่งที่มีอยู่มีการเปลี่ยนแปลงสิ่งนี้ก็ไม่มีประโยชน์

เมื่อฉันเพิ่มในการโยกย้ายสิ่งต่างๆทำงานอย่างไร เห็นได้ชัดว่าฉันไม่ต้องการให้ตารางที่มีอยู่ (ที่มีข้อมูลอยู่ในนั้น) ถูกลบออกดังนั้นจึงsync force: trueไม่ต้องสงสัยเลย ในแอปอื่น ๆ ที่ฉันได้ช่วยพัฒนา (Laravel และเฟรมเวิร์กอื่น ๆ ) ซึ่งเป็นส่วนหนึ่งของขั้นตอนการปรับใช้ของแอปเราเรียกใช้คำสั่งโยกย้ายเพื่อเรียกใช้การย้ายข้อมูลที่รอดำเนินการ แต่ในแอปเหล่านี้การย้ายข้อมูลครั้งแรกจะมีฐานข้อมูลโครงกระดูกโดยฐานข้อมูลอยู่ในสถานะที่เป็นช่วงต้นของการพัฒนาไม่ว่าจะเป็นรุ่นอัลฟ่ารุ่นแรกหรืออะไรก็ตาม ดังนั้นแม้แต่อินสแตนซ์ของแอปที่ไปปาร์ตี้ช้าก็สามารถเร่งความเร็วได้ในคราวเดียวโดยเรียกใช้การย้ายข้อมูลทั้งหมดตามลำดับ

ฉันจะสร้าง "การย้ายครั้งแรก" ใน Sequelize ได้อย่างไร หากฉันไม่มีอินสแตนซ์ใหม่ของแอปในทางที่ผิดจะไม่มีฐานข้อมูลโครงกระดูกให้เรียกใช้การย้ายข้อมูลหรือจะเรียกใช้การซิงค์เมื่อเริ่มต้นและจะทำให้ฐานข้อมูลอยู่ในสถานะใหม่ทั้งหมด ตารางใหม่เป็นต้น แต่เมื่อพยายามเรียกใช้การย้ายข้อมูลพวกเขาจะไม่สมเหตุสมผลเนื่องจากถูกเขียนด้วยฐานข้อมูลดั้งเดิมและการทำซ้ำแต่ละครั้งจะอยู่ในใจ

กระบวนการคิดของฉัน: ในทุกขั้นตอนฐานข้อมูลเริ่มต้นบวกกับการโยกย้ายแต่ละครั้งตามลำดับควรเท่ากับ (บวกหรือลบข้อมูล) ฐานข้อมูลที่สร้างขึ้นเมื่อ sync force: trueกำลังทำงานอยู่ เนื่องจากคำอธิบายแบบจำลองในรหัสอธิบายโครงสร้างฐานข้อมูล ดังนั้นบางทีถ้าไม่มีตารางการย้ายข้อมูลเราก็แค่เรียกใช้การซิงค์และทำเครื่องหมายการย้ายข้อมูลทั้งหมดว่าเสร็จสิ้นแม้ว่าจะไม่ได้ทำงานก็ตาม นี่คือสิ่งที่ฉันต้องทำ (อย่างไร) หรือ Sequelize ควรจะทำเองหรือฉันเห่าต้นไม้ผิด? และถ้าฉันอยู่ในพื้นที่ที่เหมาะสมก็ควรมีวิธีที่ดีในการสร้างการย้ายข้อมูลส่วนใหญ่โดยอัตโนมัติเนื่องจากโมเดลเก่า ๆ (โดยคอมมิตแฮช? หรือแม้กระทั่งการโอนย้ายแต่ละครั้งจะเชื่อมโยงกับคอมมิตหรือไม่ฉันยอมรับว่าฉันกำลังคิด ในจักรวาลที่มี git เป็นศูนย์กลางที่ไม่พกพาได้) และรุ่นใหม่ ๆ มันสามารถเปลี่ยนโครงสร้างและสร้างคำสั่งที่จำเป็นในการเปลี่ยนฐานข้อมูลจากเก่าเป็นใหม่และย้อนกลับจากนั้นนักพัฒนาสามารถเข้าไปและทำการปรับแต่งที่จำเป็น (การลบ / การเปลี่ยนข้อมูลโดยเฉพาะ ฯลฯ )

เมื่อฉันรันไบนารีภาคต่อด้วย--initคำสั่งมันจะทำให้ฉันมีไดเร็กทอรีการโอนย้ายที่ว่างเปล่า เมื่อฉันเรียกใช้sequelize --migrateมันทำให้ฉันเป็นตาราง SequelizeMeta โดยไม่มีอะไรอยู่ในนั้นไม่มีตารางอื่น ไม่แน่นอนเพราะไบนารีนั้นไม่ทราบวิธีบูตสแตรปแอปของฉันและโหลดโมเดล

ฉันต้องขาดอะไรบางอย่าง

TLDR: ฉันจะตั้งค่าแอปและการย้ายข้อมูลได้อย่างไรเพื่อให้อินสแตนซ์ต่างๆของแอปถ่ายทอดสดได้รับการอัปเดตตลอดจนแอปใหม่เอี่ยมที่ไม่มีฐานข้อมูลเริ่มต้นแบบเดิม


2
ฉันได้ตอบเกี่ยวกับขั้นตอนการทำงานของคุณแล้ว แต่ควรตั้งค่าตารางทั้งหมดโดยใช้การย้ายข้อมูล แม้ว่าคุณจะใช้syncในตอนนี้ แต่แนวคิดก็คือการย้ายข้อมูล "สร้าง" ฐานข้อมูลทั้งหมดดังนั้นการอาศัยโครงกระดูกจึงเป็นปัญหาในตัวมันเอง ตัวอย่างเช่นขั้นตอนการทำงาน Ruby on Rails ใช้การย้ายข้อมูลสำหรับทุกสิ่งและมันก็ค่อนข้างยอดเยี่ยมเมื่อคุณคุ้นเคยกับมัน แก้ไข: และใช่ฉันสังเกตว่าคำถามนี้ค่อนข้างเก่า แต่เนื่องจากไม่เคยมีคำตอบที่น่าพอใจและผู้คนอาจมาที่นี่เพื่อขอคำแนะนำฉันคิดว่าฉันควรมีส่วนร่วม
Fernando Cordeiro

คำตอบ:


89

การสร้าง "การย้ายข้อมูลครั้งแรก"

ในกรณีของคุณวิธีที่น่าเชื่อถือที่สุดคือทำด้วยตนเองเกือบทั้งหมด ฉันขอแนะนำให้ใช้เครื่องมือsequelize-cli ไวยากรณ์ค่อนข้างธรรมดา:

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

สิ่งนี้จะสร้างทั้งแบบจำลองและการย้ายข้อมูล จากนั้นผสานโมเดลที่มีอยู่ของคุณด้วยตนเองที่สร้างขึ้นด้วย sequelize-cli และดำเนินการเช่นเดียวกันกับการย้ายข้อมูล หลังจากทำสิ่งนี้ให้ล้างฐานข้อมูล (ถ้าเป็นไปได้) และเรียกใช้

sequelize db:migrate

สิ่งนี้จะสร้างสคีมาจะย้ายข้อมูล คุณควรดำเนินการนี้เพียงครั้งเดียวเพื่อเปลี่ยนไปใช้กระบวนการพัฒนาสคีมาที่เหมาะสม (โดยไม่ต้องซิงค์: บังคับ แต่มีการโยกย้ายที่เชื่อถือได้)

ในภายหลังเมื่อคุณต้องการเปลี่ยนสคีมา:

  1. สร้างการย้ายข้อมูล: sequelize migration:create
  2. เขียนฟังก์ชันขึ้นและลงในไฟล์การย้ายข้อมูลของคุณ
  3. ตามการเปลี่ยนแปลงของคุณในไฟล์การย้ายข้อมูลให้เปลี่ยนโมเดลของคุณด้วยตนเอง
  4. วิ่ง sequelize db:migrate

กำลังเรียกใช้การย้ายข้อมูลในการผลิต

เห็นได้ชัดว่าคุณไม่สามารถ ssh ไปยังเซิร์ฟเวอร์ที่ใช้งานจริงและเรียกใช้การย้ายข้อมูลด้วยมือได้ ใช้umzugซึ่งเป็นเครื่องมือการย้ายข้อมูลโดยไม่เชื่อเรื่องพระเจ้าของกรอบสำหรับ Node.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 เม.ย. 2559

หลังจากหนึ่งปียังคงมีประโยชน์ดังนั้นการแบ่งปันเคล็ดลับปัจจุบันของฉัน ตอนนี้ฉันกำลังติดตั้ง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แต่สิ่งที่ฉันต้องทำบนเซิร์ฟเวอร์การผลิต คำสั่งนี้จะเรียกใช้การย้ายข้อมูลทั้งหมดใช้ seeders ทั้งหมดและเริ่มเซิร์ฟเวอร์แอพ ไม่จำเป็นต้องโทรหา umzug ด้วยตนเอง


3
ฟังดูเหมือนสิ่งที่ฉันกำลังมองหา ดูเหมือนจะไม่วิเศษและเป็นอัตโนมัติเท่าที่ควร แต่อาจเป็นสิ่งที่ดีที่สุดที่สามารถหวังได้ อย่างไรก็ตามตอนนี้ฉันไม่ได้ทำงานกับ Sequelize และจะไม่สามารถทดสอบได้ในเร็ว ๆ นี้ แต่ถ้าใครเห็นด้วยว่าวิธีนี้ดีฉันจะยอมรับคำตอบนี้ ฉันยังคงรู้สึกเศร้าเล็กน้อยที่ดูเหมือนจะไม่มีวิธีใดที่จะทำการย้ายข้อมูลเหล่านี้โดยอัตโนมัติจากความแตกต่างระหว่างรุ่นต่างๆ
tremby

4
@trem โดยเฟรมเวิร์กเดียวที่ฉันใช้ที่เข้าใจโมเดลจริงๆคือ Django มันวิเคราะห์โมเดลและถามว่า "ดูเหมือนว่าคุณจะเปลี่ยนชื่อฟิลด์เป็น first_name ในผู้ใช้โมเดลคุณต้องการสร้างการย้ายข้อมูลหรือไม่" ใน Django มันใช้งานได้เกือบจะน่าอัศจรรย์เครื่องมืออื่น ๆ ที่ฉันใช้ถือว่าใช้วิธีการย้ายข้อมูลแบบเดียวกับที่ฉันได้กล่าวไว้ข้างต้น: คุณมีหน้าที่ในการเขียนการย้ายข้อมูลด้วยตัวเองเข้าใจอย่างลึกซึ้งว่าจะเพิ่มฟิลด์ประเภทใดเพื่อให้เป็นจริงในสถานะแบบจำลองปัจจุบันของคุณ
f1nn

2
คุณสามารถกำจัดpendingแล้วและเพียงแค่ทำexecute umzug.up().then(function (migrations) { app.listen(3000); })ตามเอกสาร umzug สิ่งนี้จะดำเนินการย้ายข้อมูลที่รอดำเนินการทั้งหมด
Vinay

เมื่อคุณเสร็จสิ้นการย้ายข้อมูลเป็นเรื่องปกติที่จะเพิ่มฟิลด์ลงในสคีมาในไฟล์โมเดลดั้งเดิมหรือไม่
เทพารักษ์

@ f1nn ฉันมีคำถามเกี่ยวกับการตั้งค่าของคุณคุณจะจัดการกับการจัดกลุ่มแอปและความพร้อมใช้งานอย่างไร ฉันจะรวม pm2 ไว้ในเวิร์กโฟลว์ของฉันและบางทีมันอาจจะไม่ตรงไปตรงมากับสคริปต์ npm
diosney

17

เพิ่งเรียนรู้สิ่งนี้ด้วยตัวเอง แต่ฉันคิดว่าฉันจะแนะนำให้ใช้การย้ายข้อมูลตอนนี้เพื่อให้คุณคุ้นเคย ฉันพบสิ่งที่ดีที่สุดในการหาสิ่งที่จะเกิดขึ้นในการโยกย้ายคือการดู 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

ฉันใช้กาแฟเพื่อเรียกใช้ไฟล์ seed เพื่อเติมข้อมูลในตารางหลังจาก:

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/แน่นอน แต่คำตอบพื้นฐานคือคุณต้องเพิ่มทุกอย่างในตัวเองเพื่อระบุช่องที่คุณต้องการ มันไม่ได้ทำเพื่อคุณ


5
ฉันไม่ได้ถามว่าจะสร้างและเรียกใช้การย้ายข้อมูลอย่างไร - อย่างที่คุณระบุนั่นคือทั้งหมดที่มีอยู่ในเอกสารประกอบ สิ่งที่ฉันถามคือวิธีใช้ในบริบทของแอปพลิเคชันที่ใช้ซ้ำได้ซึ่งจำเป็นต้องอัปเดตอินสแตนซ์ที่มีอยู่เป็นเวอร์ชันฐานข้อมูลที่ใหม่กว่าและอินสแตนซ์ใหม่ต้องการฐานข้อมูลนั้นตั้งแต่เริ่มต้น หรือบางทีคุณกำลังตอบคำถามนั้นและบอกว่าฉันไม่ควรใช้ sync () เลยและสร้างฐานข้อมูลเริ่มต้นและเปลี่ยนแปลงทั้งหมดในการย้ายข้อมูล นั่นคือสิ่งที่คุณกำลังพูด?
tremby

1
@tremby ฉันคิดว่านั่นคือสิ่งที่เขาพูด คุณสามารถใช้การซิงค์และจัดการกับผลลัพธ์หรือคุณสามารถสร้างการย้ายข้อมูลทั้งหมดด้วยตนเอง เฟรมเวิร์กของเราในรูปแบบ Rails-esque สร้างไฟล์การโอนย้ายตาม schema diff ฉันจะชอบถ้า Sequelize จะทำเพื่อฉัน เจ็บปวดมากเกินไปที่จะทำการโยกย้ายด้วยตนเอง ...
mpowered

1
เป็นเรื่องน่าเสียดายที่คุณไม่สามารถsequelize.sync()สร้างสคริปต์ที่สร้างตารางพื้นฐานและดัชนีทั้งหมดเป็นการย้ายข้อมูลครั้งแรกของคุณได้ (คล้ายกับราง ' schema.rb) หลังจากอ่านสิ่งนี้แล้วดูเหมือนว่าทางออกที่ดีที่สุดของคุณคือการส่งออกสคีมาเริ่มต้นของคุณ ในรูปแบบ sql จากนั้นใส่เป็นexecคำสั่งใหญ่ในการย้ายข้อมูลครั้งแรกของคุณ จากนั้นคุณจะเรียกใช้การเปลี่ยนแปลงเพิ่มเติมกับจุดเริ่มต้น "เวอร์ชัน 1.0" ที่รู้จัก
thom_nic

11

สำหรับการพัฒนาขณะนี้มีตัวเลือกในการซิงค์ตารางปัจจุบันโดยการปรับเปลี่ยนโครงสร้าง เมื่อใช้เวอร์ชันล่าสุดจากrepo github ต่อเนื่องคุณสามารถเรียกใช้การซิงค์กับalterพารามิเตอร์ได้แล้ว

Table.sync({alter: true})

ข้อแม้จากเอกสาร:

ปรับเปลี่ยนตารางให้พอดีกับโมเดล ไม่แนะนำให้ใช้ในการผลิต ลบข้อมูลในคอลัมน์ที่ถูกลบออกหรือมีการเปลี่ยนแปลงประเภทในโมเดล


3

ตอนนี้การโยกย้ายภาคต่อใหม่นั้นง่ายมาก

นี่คือตัวอย่างสิ่งที่คุณสามารถทำได้

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

ในการกำหนดค่าฐานข้อมูล


สิ่งนี้ไม่เพียงแค่ทิ้งและสร้างฐานข้อมูลใหม่หรือไม่?
TWilly

ฉันคิดว่าการใช้ไฟล์ sql ขนาดใหญ่เริ่มต้นไม่ใช่วิธีที่แนะนำเนื่องจากจะผูกอะแดปเตอร์และฐานข้อมูลซึ่งมิฉะนั้นจะเป็นฐานข้อมูลที่ไม่เชื่อเรื่องพระเจ้าเนื่องจากคุณสามารถใช้สำหรับการพัฒนา sqlite และสำหรับการผลิต mariadb หรืออื่น ๆ
diosney

3

ฉันอ่านโพสต์นี้และคำถามที่คล้ายกันมันไม่ได้ตอบโจทย์สำหรับฉันจริงๆ การย้ายข้อมูลมีประโยชน์สำหรับการสร้างฐานข้อมูลภายในเครื่องและสำหรับการอัปเดตข้อมูลในการผลิต

ฉันถามคำถามที่นี่และได้รับคำตอบเช่นกัน: เวิร์กโฟลว์สำหรับจัดการลำดับการย้ายข้อมูลและการเริ่มต้น?

เวอร์ชัน TL-DR สำหรับโครงการกรีนฟิลด์

  1. ออกแบบสคีมาฐานข้อมูลของคุณตามปกติโดยใช้สคริปต์ SQL บริสุทธิ์หรือหากคุณใช้เครื่องมือ gui แทน
  2. เมื่อคุณสรุปสคีมา db ทั้งหมด 95% ของคุณและพอใจกับมันแล้วให้ดำเนินการต่อและย้ายไปต่อเนื่องโดยการย้ายทั้ง.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;
`),
};

ป้อนคำอธิบายภาพที่นี่

ด้วยโครงสร้างโฟลเดอร์ทั่วไปนี้

ป้อนคำอธิบายภาพที่นี่

  1. ตอนนี้การตั้งค่า sequelize ของคุณซิงค์กับ schema ฐานข้อมูลเริ่มต้นของคุณแล้ว
  2. เมื่อคุณต้องการแก้ไขสคีมาฐานข้อมูลให้เรียกใช้อีกครั้ง sequelize migration:generate --name [name_of_your_migration]
  3. ดำเนินการแก้ไขได้ที่นี่ในเส้นทางupและการdownย้ายข้อมูล นี่คือคำสั่ง ALTER ของคุณเพื่อเปลี่ยนชื่อคอลัมน์ DELETE เพิ่มคอลัมน์ ฯลฯ
  4. วิ่ง sequelize db:migrate
  5. npm install sequelize-autoคุณต้องการรุ่นซิงค์กับการเปลี่ยนแปลงไปยังฐานข้อมูลระยะไกลของคุณดังนั้นสิ่งที่คุณสามารถทำได้ในขณะนี้คือ
  6. สิ่งนี้จะอ่านสคีมาฐานข้อมูลปัจจุบันบนฐานข้อมูลของคุณและสร้างไฟล์โมเดลโดยอัตโนมัติ ใช้คำสั่งที่คล้ายกับที่sequelize-auto -o "./models" -d sequelize_auto_test -h localhost -u my_username -p 5432 -x my_password -e postgresพบในhttps://github.com/sequelize/sequelize-auto

คุณสามารถใช้ git เพื่อดู difflogs ในโมเดลของคุณควรมีการเปลี่ยนแปลงที่สะท้อนถึงการเปลี่ยนแปลงในโมเดลฐานข้อมูลเท่านั้น โปรดทราบว่าอย่าปรับเปลี่ยนmodelsโดยตรงหากคุณใช้sequelize autoเนื่องจากจะสร้างให้คุณ ในทำนองเดียวกันคุณไม่ควรแก้ไขสคีมาฐานข้อมูลของคุณโดยตรงกับไฟล์ SQL อีกต่อไปเนื่องจากนี่เป็นตัวเลือกที่คุณสามารถนำเข้า.sqlไฟล์เหล่านั้นได้เช่นกัน

ตอนนี้สคีมาฐานข้อมูลของคุณเป็นข้อมูลล่าสุดแล้วและคุณได้ย้ายอย่างเป็นทางการไปที่การย้ายฐานข้อมูลต่อเนื่องเท่านั้น

ทุกอย่างควบคุมเวอร์ชัน นี่คือเวิร์กโฟลว์ที่เหมาะสำหรับฐานข้อมูลและนักพัฒนาแบ็กเอนด์


2

ใช้เวอร์ชัน เวอร์ชันของแอปพลิเคชันขึ้นอยู่กับเวอร์ชันของฐานข้อมูล หากเวอร์ชันใหม่ต้องการการอัปเดตฐานข้อมูลให้สร้างการย้ายข้อมูล

อัปเดต: ฉันตัดสินใจที่จะละทิ้งการย้ายข้อมูล ( KISS ) และเรียกใช้สคริปต์ update_db (sync forse: false) เมื่อจำเป็น


คล้ายกับคำตอบของฉันต่อคำตอบของ user1916988 คุณกำลังบอกว่าฉันไม่ควรใช้sync()เลยและฉันจำเป็นต้องเขียนการย้ายข้อมูลจากสคีมาของรุ่นเก่าไปยังรุ่นที่ใหม่กว่าด้วยตนเองหรือไม่
tremby

ฉัน +1 ed เนื่องจากการอัปเดตของคุณ ฉันคิดจะทำแบบเดียวกันจริงๆ การเขียนการย้ายข้อมูลทั้งหมดด้วยตนเองเมื่อแอปสามารถทำได้นั้นค่อนข้างโง่ดังนั้นฉันจะสร้างสคริปต์ด้วยตนเองที่เรียกใช้แอปเพียงครั้งเดียวและเรียกใช้ฟังก์ชันการซิงค์
Sallar

2

ช้าไปหน่อยและหลังจากอ่านเอกสารแล้วคุณไม่จำเป็นต้องมีการย้ายข้อมูลครั้งแรกที่คุณกำลังพูดถึง สิ่งที่คุณต้องทำคือโทรsyncเพื่อสร้างตาราง

sequelize.sync()

คุณยังสามารถเรียกใช้การซิงโครไนซ์โมเดลอย่างง่ายโดยทำสิ่งต่อไปนี้

Project.sync()แต่ฉันคิดว่าsequelize.sync()เป็นกรณีทั่วไปที่มีประโยชน์มากกว่าสำหรับโครงการของคุณ (ตราบใดที่คุณนำเข้าโมเดลที่ดีในเวลาเริ่มต้น)

(นำมาจากhttp://sequelizejs.com/docs/latest/models#database-synchronization )

สิ่งนี้จะสร้างโครงสร้างเริ่มต้นทั้งหมด หลังจากนั้นคุณจะต้องสร้างการย้ายข้อมูลเพื่อที่จะพัฒนาสคีมาของคุณเท่านั้น

หวังว่ามันจะช่วยได้


8
ฉันไม่คิดว่าคุณอ่านโพสต์ต้นฉบับอย่างละเอียดถี่ถ้วนหรือบางทีฉันก็ไม่ชัดเจนพอ ฉันมากกว่าที่จะตระหนักsequelize.sync()และสิ่งที่มันทำ
tremby

2

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');
  • เรียกใช้ดัมพ์นี้บน Sequelize Migration:
module.exports = {
  up: function (migration, DataTypes) {
    var baseSQL = "whatever" // I recommend loading a file
    migration.migrator.sequelize.query(baseSQL);
  }
}

ที่ควรดูแลการตั้งค่าฐานข้อมูลแม้ว่าสิ่งที่ไม่ตรงกันอาจกลายเป็นปัญหาได้ หากเป็นเช่นนั้นฉันจะดูวิธีเลื่อนการส่งคืนupฟังก์ชัน sequelize ออกไปจนกว่าqueryฟังก์ชันasync จะเสร็จสิ้น

ข้อมูลเพิ่มเติมเกี่ยวกับ mysql_dump: http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html
ข้อมูลเพิ่มเติมเกี่ยวกับการโยกย้ายตามลำดับ: http://sequelize.readthedocs.org/en/latest/docs/migrations/
ข้อมูลเพิ่มเติมเกี่ยวกับ การเรียกใช้ SQL จากภายใน Sequelize Migration: https://github.com/sequelize/sequelize/issues/313


1

นี่คือเวิร์กโฟลว์ปัจจุบันของฉัน ฉันเปิดรับข้อเสนอแนะ

  1. ตั้งค่า sequelize เพื่อสร้างตารางที่ไม่มีอยู่
  2. ตั้งค่า sequelize เพื่อวางและสร้างตารางใหม่ทั้งหมดในฐานข้อมูลเปล่าที่เรียกว่า _blank
  3. ใช้เครื่องมือ mysql เพื่อเปรียบเทียบ _blank และและซิงค์การเปลี่ยนแปลงโดยใช้เครื่องมือนั้น ยังคงมองหาเครื่องมือราคาประหยัดที่สามารถทำได้บน Mac MySql workbench ดูเหมือนว่าคุณสามารถนำเข้าโมเดลจากสคีมาที่มีอยู่จากนั้นจึงซิงค์สคีมา พยายามหาวิธีทำผ่าน command line เพื่อให้ง่าย

ด้วยวิธีนี้คุณไม่ต้องอัปเดตตารางการย้ายข้อมูลด้วยตนเองและไม่ต้องกังวลเรื่องนิ้วอ้วน แต่คุณยังคงได้รับ ORM


1

เพื่อนฉันมีคำถามเดียวกันและเข้าใจวิธีใช้งาน

ฉันเริ่มต้นโดยไม่มี ORM ตามลำดับดังนั้นฉันจึงมีโมเดลข้อมูลอยู่แล้ว
ฉันต้องสร้างโมเดลโดยอัตโนมัติด้วย sequelize-auto และสร้างการย้ายข้อมูลด้วยไฟล์นี้ที่คุณสร้างhttps://gist.github.com/ahelord/a7a7d293695b71aadf04157f0f7dee64และทำการซิงค์ ( {Force: false})
นี่อยู่ใน dev ฉันจะต้องเป็นเวอร์ชัน โมเดลและการโอนย้ายและดำเนินการทุกครั้งที่ฉันดึงโค้ด

ในการใช้งานจริงเซิร์ฟเวอร์จะอยู่ชั้นบนเท่านั้นดังนั้นคุณจึงต้องเรียกใช้การย้ายข้อมูลและในแต่ละคอมมิตจะจัดการเนื่องจากคุณจะกำหนดเวอร์ชันของโมเดลโดยไม่ต้องหยุดแบ็กเอนด์


0

ยังมีวิธีที่ง่ายกว่านั้นอีก (หลีกเลี่ยงการเรียงลำดับ) ซึ่งจะเป็นดังนี้:

  1. คุณพิมพ์คำสั่งภายในโปรเจ็กต์ของคุณ: npm run migrate: new

  2. สิ่งนี้จะสร้างไฟล์ 3 ไฟล์ ไฟล์ js และไฟล์ sql สองไฟล์ที่ตั้งชื่อขึ้นและลง

  3. คุณใส่คำสั่ง SQL ของคุณในไฟล์เหล่านั้นซึ่งเป็น sql ที่บริสุทธิ์
  4. จากนั้นคุณพิมพ์: npm run migrate: upหรือnpm run migrate: down

เพื่อให้ได้ผลโปรดดูที่โมดูลdb-migrate

เมื่อคุณตั้งค่าเรียบร้อยแล้ว (ซึ่งไม่ใช่เรื่องยาก) การเปลี่ยนฐานข้อมูลของคุณทำได้ง่ายมากและประหยัดเวลาได้มาก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.