Sequelize.js: মাইগ্রেশন এবং সিঙ্ক কীভাবে ব্যবহার করবেন


137

আমি আমার প্রকল্প চালু করতে প্রস্তুত থাকার কাছাকাছি। লঞ্চের পরে আমার বড় পরিকল্পনা রয়েছে এবং ডাটাবেস কাঠামোটি পরিবর্তন হতে চলেছে - বিদ্যমান সারণীতে নতুন কলাম পাশাপাশি নতুন টেবিলগুলি এবং বিদ্যমান এবং নতুন মডেলগুলিতে নতুন অ্যাসোসিয়েশন।

আমি সিকিলাইজে মাইগ্রেশনগুলি এখনও স্পর্শ করতে পারি নি, যেহেতু আমার কাছে কেবলমাত্র পরীক্ষার ডেটা ছিল যা প্রতিবার ডাটাবেস পরিবর্তনের সময় মুছে ফেলার বিষয়ে আমার আপত্তি নেই।

সে লক্ষ্যে, বর্তমানে আমি sync force: trueযখন আমার অ্যাপ্লিকেশনটি শুরু হবে তখন আমি চালাচ্ছি , যদি আমি মডেল সংজ্ঞাগুলি পরিবর্তন করে থাকি। এটি সমস্ত সারণী মুছে ফেলে এবং এগুলি স্ক্র্যাচ থেকে তৈরি করে। forceএটি কেবলমাত্র নতুন টেবিল তৈরি করার বিকল্পটি আমি বাদ দিতে পারি । তবে বিদ্যমানগুলি যদি পরিবর্তিত হয় তবে এটি কার্যকর নয়।

সুতরাং একবার আমি মাইগ্রেশনগুলিতে যুক্ত করব কীভাবে জিনিসগুলি কাজ করে? স্পষ্টতই আমি চাই না যে বিদ্যমান সারণীগুলি (এতে থাকা ডেটা সহ) মুছে ফেলা হোক, তাই sync force: trueপ্রশ্ন থেকে যায়। অন্যান্য অ্যাপ্লিকেশনগুলিতে আমি অ্যাপ্লিকেশনটির মোতায়েনের প্রক্রিয়াটির অংশ হিসাবে (লারাভেল এবং অন্যান্য ফ্রেমওয়ার্ক) বিকাশে সহায়তা করেছি আমরা কোনও মুলতুবি থাকা মাইগ্রেশন চালাতে মাইগ্রেট কমান্ডটি চালাই। তবে এই অ্যাপ্লিকেশনগুলিতে খুব প্রথম মাইগ্রেশনের একটি কঙ্কাল ডাটাবেস রয়েছে, যেখানে ডেটাবেসটি সেই রাজ্যের ডেটাবেস যেখানে এটি কিছুটা আগে বিকাশের প্রথম দিকে ছিল - প্রথম আলফা প্রকাশ বা যা-ই হোক না কেন। এমনকি পার্টিতে দেরি হয়ে যাওয়া অ্যাপ্লিকেশনটির একটি উদাহরণও একসাথে সমস্ত মাইগ্রেশনকে ক্রমানুসারে চালিয়ে এক সাথে গতি পেতে পারে।

সিক্যুইলাইজে কীভাবে আমি এই জাতীয় "প্রথম স্থানান্তর" তৈরি করব? যদি আমার কাছে এটি না থাকে তবে লাইনের একদম নিচে অ্যাপ্লিকেশনটির নতুন উদাহরণটিতে মাইগ্রেশন চালুর জন্য কোনও কঙ্কাল ডাটাবেস থাকবে না, বা এটি শুরুতে সিঙ্কটি চলবে এবং সমস্ত দিয়ে ডেটাবেসকে নতুন অবস্থায় তৈরি করবে নতুন টেবিল ইত্যাদি, কিন্তু তারপরে যখন এটি মাইগ্রেশনগুলি চালানোর চেষ্টা করে তখন সেগুলি বোধগম্য হবে না, যেহেতু সেগুলি মূল ডাটাবেস এবং প্রতিটি ক্রমাগত পুনরাবৃত্তির কথা মাথায় রেখে লেখা হয়েছিল।

আমার চিন্তা প্রক্রিয়া: প্রতিটি পর্যায়ে, প্রাথমিক ডাটাবেস প্লাস প্রতিটি মাইগ্রেশন ক্রম অনুসারে ডাটাবেস উত্পন্ন যখন (প্লাস বা বিয়োগ ডেটা) হতে হবে sync force: trueচালানো হয় কোডের মডেল বিবরণে ডাটাবেস কাঠামো বর্ণনা করা হয় কারণ এটি। সুতরাং কোনও মাইগ্রেশন টেবিল না থাকলে আমরা কেবল সিঙ্ক চালাই এবং সমস্ত স্থানান্তর চালিত না হওয়া সত্ত্বেও চিহ্নিত করে রাখি they এটিই আমার কী করা উচিত (কীভাবে?), বা সিকিলাইজ নিজেই এটি করার কথা বলেছে, বা আমি ভুল গাছটি ছাঁটাই করছি? এবং যদি আমি সঠিক অঞ্চলে থাকি তবে অবশ্যই পুরানো মডেলগুলি (কমিট হ্যাশ দ্বারা? বা প্রতিটি স্থানান্তরকে একটি প্রতিশ্রুতিবদ্ধভাবে আবদ্ধ করা যেতে পারে?) দেওয়া সত্ত্বেও বেশিরভাগ স্থানান্তরকে স্বয়ংক্রিয়ভাবে উত্পন্ন করার একটি দুর্দান্ত উপায় থাকা উচিত? আমি স্বীকার করি আমি ভাবছি অ-বহনযোগ্য গিট-কেন্দ্রিক মহাবিশ্বে) এবং নতুন মডেলগুলি। এটি কাঠামোটির পার্থক্য করতে পারে এবং ডাটাবেসটিকে পুরানো থেকে নতুন, এবং পিছনে রূপান্তর করতে প্রয়োজনীয় কমান্ড তৈরি করতে পারে এবং তারপরে বিকাশকারী প্রবেশ করতে এবং প্রয়োজনীয় কোনও টুইট তৈরি করতে (নির্দিষ্ট ডেটা মোছা / স্থানান্তরকরণ) করতে পারে।

--initকমান্ডটি দিয়ে সিক্যুয়ালাইজ বাইনারি চালানোর সময় এটি আমাকে একটি খালি মাইগ্রেশন ডিরেক্টরি দেয়। তারপরে আমি যখন sequelize --migrateএটি চালনা করি এটি আমাকে একটি সিক্যুইলাইজমেটা টেবিল তৈরি করে যাতে কিছুই নেই, অন্য কোনও টেবিল নেই। স্পষ্টতই নয়, কারণ এই বাইনারি আমার অ্যাপ্লিকেশনটি বুটস্ট্রেপ করতে এবং মডেলগুলি লোড করতে জানে না।

আমি নিশ্চিত কিছু একটা ভুলে যাচ্ছি।

টিএলডিআর: আমি কীভাবে আমার অ্যাপ্লিকেশন এবং এর স্থানান্তরগুলি সেট আপ করব যাতে লাইভ অ্যাপ্লিকেশনটির বিভিন্ন ঘটনা আধুনিকীকরণ করা যায়, তেমনি কোনও ব্র্যান্ডস নতুন অ্যাপ্লিকেশনও নেই যা কোনও উত্তরাধিকার সূচনা হয় না?


2
আমি আপনার ওয়ার্কফ্লো সম্পর্কিত উত্তর দিয়েছি, তবে আদর্শভাবে সমস্ত টেবিলগুলি মাইগ্রেশন ব্যবহার করে সেটআপ করা উচিত। এমনকি যদি আপনি syncআপাতত ব্যবহার করছেন, ধারণাটি হ'ল মাইগ্রেশনগুলি পুরো ডাটাবেসটি "উত্পন্ন" করে, সুতরাং একটি কঙ্কালের উপর নির্ভর করা নিজেই একটি সমস্যা। উদাহরণস্বরূপ, রেল অন রেল ওয়ার্কফ্লো, সব কিছুর জন্য মাইগ্রেশন ব্যবহার করে এবং এটি ব্যবহার করার পরে এটি দুর্দান্ত। সম্পাদনা: এবং হ্যাঁ, আমি লক্ষ্য করেছি যে এই প্রশ্নটি বেশ পুরানো, তবে এর আগে কখনও সন্তোষজনক উত্তর পাওয়া যায় নি এবং লোকেরা এখানে গাইডেন্স খুঁজতে চাইতে পারে, আমি বুঝতে পেরেছিলাম যে আমার অবদান রাখতে হবে।
ফার্নান্দো কর্ডেরিও

উত্তর:


88

"প্রথম স্থানান্তর" তৈরি করা হচ্ছে

আপনার ক্ষেত্রে, সবচেয়ে নির্ভরযোগ্য উপায় হ'ল এটি প্রায় ম্যানুয়ালি করা। আমি সিক্যুয়ালাইজ-ক্লাইপ সরঞ্জামটি ব্যবহার করার পরামর্শ দেব । বাক্য গঠনটি বরং সরল:

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

এটি মডেল এবং মাইগ্রেশন উভয়ই তৈরি করবে। তারপরে, সিক্যুয়ালাইজ-ক্লাইমের সাথে উত্পন্ন আপনার বিদ্যমান মডেলগুলিকে ম্যানুয়ালি মার্জ করুন এবং মাইগ্রেশনগুলির সাথে একই করুন। এটি করার পরে, ডাটাবেস মুছুন (সম্ভব হলে) এবং চালান

sequelize db:migrate

এটি স্কিমা উইল মাইগ্রেশন তৈরি করবে। স্কিমা বিকাশের যথাযথ প্রক্রিয়াতে (সিঙ্ক ছাড়াই: বল প্রয়োগ করা যায় না তবে অনুমোদনমূলক স্থানান্তর সহ) আপনি একবারে এটি করা উচিত।

পরে, যখন আপনার স্কিমা পরিবর্তন করা দরকার:

  1. একটি স্থানান্তর তৈরি করুন: sequelize migration:create
  2. আপনার মাইগ্রেশন ফাইলে আপ এবং ডাউন ফাংশন লিখুন
  3. মাইগ্রেশন ফাইলের আপনার পরিবর্তন অনুসারে ম্যানুয়ালি আপনার মডেলটি পরিবর্তন করুন
  4. চালান sequelize db:migrate

উত্পাদনে চলছে মাইগ্রেশন

স্পষ্টতই আপনি প্রোডাকশন সার্ভারে গিয়ে হাত দিয়ে মাইগ্রেশন চালাতে পারবেন না। ব্যবহারের 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
    });
});

আমি এখনই এটি চেষ্টা করতে পারি না, তবে প্রথম দেখায় এটি কাজ করা উচিত।

ইউপিডি এপ্রিল ২০১।

এক বছর পরে, এখনও দরকারী, তাই আমার বর্তমান টিপস ভাগ করে নিন। আপাতত, আমি sequelize-cliপ্রয়োজনীয় লাইভ নির্ভরতা হিসাবে প্যাকেজ ইনস্টল করছি , এবং তারপরে এনপিএম প্রারম্ভিক স্ক্রিপ্টগুলি এর 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। এই কমান্ডটি সমস্ত মাইগ্রেশন চালাবে, সমস্ত বীজতাকে প্রয়োগ করবে এবং অ্যাপ্লিকেশন সার্ভার শুরু করবে। ম্যানুয়ালি উমজুগ কল করার দরকার নেই।


3
এটি আমি যা খুঁজছি তার মতো শোনাচ্ছে। এটি "হওয়া উচিত" এর মতো যাদু এবং স্বয়ংক্রিয় বলে মনে হয় না, তবে এটিই সবচেয়ে ভাল যা আশা করা যায়। যাইহোক, আমি বর্তমানে সিকুইলাইজের সাথে কাজ করছি না এবং শিগগিরই এটি আর কোনও সময় পরীক্ষা করতে সক্ষম হবো না। তবে অন্য কেউ যদি এই সমাধানটি ভাল বলে সম্মত হন তবে আমি এই উত্তরটি গ্রহণ করব। আমি এটি এখনও একটু দু: খিত মনে করি যে মডেল সংস্করণগুলির মধ্যে পার্থক্য থেকে এই স্থানান্তরগুলি স্বয়ংক্রিয়ভাবে করার কোনও উপায় নেই বলে মনে হয়।
কাঁপুনি

4
@ ট্রিম্বি আমি একমাত্র ফ্রেমওয়ার্ক ব্যবহার করেছি যা প্রকৃতপক্ষে মডেলগুলি বোঝে সে ছিল জ্যাঙ্গো। এটি মডেলগুলি বিশ্লেষণ করে এবং "ভাল বলে মনে হয় আপনি ফিল্ডের নামটির নাম পরিবর্তন করে মডেল ব্যবহারকারীর নাম রেখেছেন you আপনি কি এর জন্য মাইগ্রেশন তৈরি করতে চান?" জ্যাঙ্গোতে এটি প্রায় যাদুকরীভাবে কাজ করে, অন্যান্য সরঞ্জামগুলি আমি ব্যবহার করেছি একইভাবে স্থানান্তর পদ্ধতির উপরে ধরে উল্লিখিত: আপনি নিজেই মাইগ্রেশন লেখার জন্য দায়বদ্ধ, আপনার বর্তমান মডেলের রাজ্যে প্রকৃত হতে কোন ধরণের ক্ষেত্রটি যুক্ত করতে হবে তা গভীরভাবে বুঝতে পেরেছেন
f1nn

2
আপনি পরিত্রাণ পেতে pendingএবং তারপর executeএবং ঠিক করতে পারেন umzug.up().then(function (migrations) { app.listen(3000); })। উমজুগ ডকুমেন্টেশন অনুসারে, এটি সমস্ত মুলতুবি স্থানান্তরকে কার্যকর করবে।
বিনয়

আপনি মাইগ্রেশন সম্পন্ন করার পরে, আসল মডেল ফাইলে স্কিমায় ক্ষেত্রগুলি যুক্ত করা কি সাধারণ?
theptrk

@ f1nn আপনার সেট আপ সম্পর্কে আমার একটি প্রশ্ন রয়েছে, আপনি কীভাবে অ্যাপ্লিকেশন ক্লাস্টারিং এবং উপলভ্যতা পরিচালনা করবেন? আমি আমার ওয়ার্কফ্লোতে pm2 সংহত করব এবং এটি এনপিএম স্ক্রিপ্টগুলির সাথে সরাসরি কাজ করে না।
ডায়োসনি

17

কেবল এটি নিজেই শিখছি, তবে আমি মনে করি আমি এখনই মাইগ্রেশন ব্যবহার করার পরামর্শ দেব যাতে আপনি তাদের অভ্যস্ত হয়ে যান। মাইগ্রেশনে যা হয় তা নির্ধারণের জন্য আমি সবচেয়ে ভাল জিনিসটি খুঁজে পেয়েছি যেটি তৈরি টেবিলগুলিতে স্ক্যুএল দেখুন sequelize.sync()এবং সেখান থেকে স্থানান্তরগুলি তৈরি করুন build

migrations -c [migration name] 

মাইগ্রেশন ডিরেক্টরিতে টেমপ্লেট স্থানান্তর ফাইল তৈরি করবে। তারপরে আপনি এটি তৈরি করতে প্রয়োজনীয় ক্ষেত্রগুলি সহ এটি স্থাপন করতে পারেন। এই ফাইলটিতে createdAt/ updatedAt, সমিতিগুলির জন্য প্রয়োজনীয় ক্ষেত্রগুলি অন্তর্ভুক্ত করা উচিত etc.

প্রাথমিক টেবিল তৈরির জন্য নীচে থাকা উচিত:

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/migration/ এ রয়েছে। তবে প্রাথমিক উত্তরটি হ'ল আপনার প্রয়োজনীয় ক্ষেত্রগুলি নির্দিষ্ট করতে আপনাকে নিজের মধ্যে সমস্ত কিছু যুক্ত করতে হবে। এটি আপনার পক্ষে করে না।


5
আমি কীভাবে মাইগ্রেশন তৈরি ও পরিচালনা করব তা জিজ্ঞাসা করছিলাম না - যেমন আপনি উল্লেখ করেছেন যে ডকুমেন্টেশনে এগুলি সবই পাওয়া যায়। আমি যা বলছিলাম তা হ'ল কীভাবে পুনরায় ব্যবহারযোগ্য অ্যাপ্লিকেশনটির প্রেক্ষাপটে সেগুলি ব্যবহার করবেন যেখানে বিদ্যমান দৃষ্টান্তগুলিকে একটি নতুন ডাটাবেস সংস্করণে আপডেট করা দরকার এবং নতুন দৃষ্টান্তগুলি স্ক্র্যাচ থেকে তৈরি করা ডাটাবেসের প্রয়োজন। অথবা সম্ভবত আপনি এর উত্তর দিচ্ছেন, এবং বলছেন যে আমার মোটেও সিঙ্ক () ব্যবহার করা উচিত নয়, এবং প্রাথমিক ডাটাবেস এবং মাইগ্রেশনে এর সমস্ত পরিবর্তন করা উচিত। তুমি কি বলছ?
কাঁপুনি

1
@ ট্রাম্বি আমি মনে করি সেটাই বলছে। আপনি হয় সিঙ্ক ব্যবহার করতে পারেন এবং ফলাফলগুলি মোকাবেলা করতে পারেন, বা আপনি সমস্ত ম্যানুয়ালি স্থানান্তর তৈরি করতে পারেন। আমাদের ফ্রেমওয়ার্কগুলি, রেলস-এস্কু ফ্যাশনে, স্কিমা ডিফের ভিত্তিতে মাইগ্রেশন ফাইলগুলি তৈরি করে, সিকুইলাইজ যদি আমার জন্য এটি করে তবে আমি ভালবাসি। ম্যানুয়ালি মাইগ্রেশন করতে খুব বেশি ব্যথা হচ্ছে ...
চালিত

এটি একটি লজ্জার বিষয় যে sequelize.sync()এরপরে আপনি কোনও জেনারেটেড স্ক্রিপ্ট রাখতে পারবেন না যা আপনার প্রথম মাইগ্রেশন (রেলের অনুরূপ schema.rb) হিসাবে সমস্ত বেস টেবিলগুলি এবং সূচকগুলি তৈরি করে না this এটি পড়ার পরে মনে হয় আপনার প্রাথমিক বাজি আপনার প্রাথমিক স্কিমা রপ্তানি করা হতে পারে হিসাবে বর্গক্ষেত্র, তারপর এটি একটি বড় মধ্যে রাখুনexec আপনার প্রথম স্থানান্তর বিবৃতি মধ্যে রাখুন। তারপরে সেখান থেকে আপনি একটি পরিচিত "সংস্করণ 1.0" শুরুর পয়েন্টের তুলনায় বর্ধিত পরিবর্তনগুলি চালাচ্ছেন।
thom_nic

11

জন্য উন্নয়ন , সেখানে এখন তাদের গঠন পরিবর্তনকারী দ্বারা বর্তমান টেবিল সিঙ্ক করার জন্য একটি বিকল্প। সিক্যুয়ালাইজ গিথুব রেপো থেকে সর্বশেষতম সংস্করণ ব্যবহার করে আপনি এখন 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 }

ডাটাবেস কনফিগারেশন।


এটি কি কেবল ডাটাবেসটি ফেলে এবং পুনরায় তৈরি করে না?
তুইলি

আমি মনে করি যে প্রারম্ভিক বৃহত এসকিউএল ফাইলটি ব্যবহার করা এটির প্রস্তাবিত উপায় নয়, যেহেতু এটি অ্যাডাপ্টার এবং ডাটাবেসটি বেঁধে রাখবে, অন্যথায় এটি ডাটাবেস অজ্ঞোস্টিক হবে, যেহেতু আপনি বিকাশ স্ক্লাইট এবং উত্পাদন মারিয়্যাডবি বা অন্যগুলির জন্য ব্যবহার করতে পারেন।
ডায়োসনি

2

সংস্করণ ব্যবহার করুন। অ্যাপ্লিকেশনটির সংস্করণ নির্ভর করে ডাটাবেসের সংস্করণে। নতুন সংস্করণে যদি কোনও ডাটাবেসের আপডেট প্রয়োজন হয় তবে এর জন্য মাইগ্রেশন তৈরি করুন।

আপডেট: আমি যখন প্রয়োজন হবে তখন মাইগ্রেশন ( কেআইএসএস ) ছেড়ে স্ক্রিপ্ট আপডেট_ডিবি (সিঙ্ক ফোরস: মিথ্যা) চালানোর সিদ্ধান্ত নিয়েছি ।


ব্যবহারকারী ১৯১ 69 88৮৮ এর উত্তরের প্রতি আমার প্রতিক্রিয়াটির অনুরূপ, আপনি কি বলছেন যে আমি মোটেও ব্যবহার sync()করা উচিত নয় এবং পুরানো সংস্করণের মডেলগুলির স্কিমা থেকে নতুন সংস্করণের মডেলগুলিতে মাইগ্রেশন নিজেই লিখতে হবে?
কাঁপুনি

আপনার আপডেটের কারণে আমি +1 সম্পাদনা করছি। আমি আসলে একই কাজ করার কথা ভাবছি। সমস্ত মাইগ্রেশন ম্যানুয়ালি লিখে যখন অ্যাপ্লিকেশনটি এটি করতে পারে কিছুটা বোকা, সুতরাং আমি কেবল একটি ম্যানুয়াল স্ক্রিপ্ট তৈরি করব যা একবার অ্যাপ্লিকেশনটি চালায় এবং সিঙ্ক ফাংশনটি চালায়।
সালার

2

কিছুটা দেরি হয়ে গেছে এবং ডকুমেন্টেশন পড়ার পরে, আপনি যে প্রথম স্থানান্তর সম্পর্কে কথা বলছেন তা আপনার প্রয়োজন হবে না। syncটেবিলগুলি তৈরি করার জন্য আপনাকে কেবল কল করতে হবে।

sequelize.sync()

আপনি এর মতো কিছু করে একটি সাধারণ মডেল সিঙ্ক্রোনাইজেশন চালাতে পারেন:

Project.sync()তবে আমি মনে করি এটি sequelize.sync()আপনার প্রকল্পের জন্য আরও কার্যকর সাধারণ ক্ষেত্রে (যতক্ষণ আপনি শুরুতে ভাল মডেলগুলি আমদানি করেন)।

( http://sequelizejs.com/docs/latest/models#datedia-Synchronization থেকে নেওয়া )

এটি সমস্ত প্রাথমিক কাঠামো তৈরি করবে । এরপরে, আপনার স্কিমার বিকাশ করার জন্য আপনাকে কেবল মাইগ্রেশন তৈরি করতে হবে।

আশা করি এটা সাহায্য করবে.


7
আমি মনে করি না আপনি মূল পোস্টটি খুব ভাল করে পড়েছেন, বা সম্ভবত আমি যথেষ্ট পরিষ্কার ছিলাম না। আমি সচেতন sequelize.sync()এবং এটি কী করে তার চেয়ে বেশি ।
কাঁপুনি

2

Sequelize নির্বিচারে এসকিউএল চালাতে পারেন অ্যাসিঙ্ক্রোনাস

আমি যা করবো তা হ'ল:

  • একটি অভিবাসন তৈরি করুন (প্রথম স্থানান্তর হিসাবে ব্যবহার করতে);
  • আপনার ডাটাবেসটি ডাম্প করুন, এরকম কিছু: 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

মাইএসকিএল_ডাম্প সম্পর্কে আরও: http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html
সিক্যুইলাইজ মাইগ্রেশন সম্পর্কে আরও জানুন: http://sequelize.readthedocs.org/en/latest/docs/migrations/
সম্পর্কে আরও সিকিলাইজ মাইগ্রেশনের মধ্যে থেকে এসকিউএল চালানো: https ://github.comsequelize/sequelize/issues/313


1

আমার বর্তমান কর্মপ্রবাহ এখানে। আমি পরামর্শ খোলা।

  1. অস্তিত্ব নেই এমন টেবিলগুলি তৈরি করতে সিক্যুয়ালাইজ সেট করুন
  2. _Blank নামক একটি ফাঁকা ডাটাবেসে সমস্ত টেবিলগুলি ড্রপ এবং পুনরায় তৈরি করতে সিক্যুয়ালাইজ সেট করুন
  3. _Blank এবং সেই সরঞ্জামটি ব্যবহার করে পরিবর্তনগুলি সিঙ্ক করার জন্য একটি mysql সরঞ্জাম ব্যবহার করুন। এখনও একটি সাশ্রয়ী মূল্যের সরঞ্জাম খুঁজছেন যা ম্যাক এ করতে পারে। মাইএসকিউএল ওয়ার্কবেঞ্চ দেখে মনে হচ্ছে আপনি কোনও বিদ্যমান স্কিমা থেকে কোনও মডেল আমদানি করতে পারেন এবং তারপরে স্কিমা সিঙ্ক করতে পারেন। এটি সহজ করার জন্য কমান্ড লাইনের মাধ্যমে কীভাবে এটি করবেন তা জানার চেষ্টা করছেন।

এইভাবে আপনাকে মাইগ্রেশন টেবিলটি ম্যানুয়ালি আপডেট করতে হবে না এবং চর্বিযুক্ত আঙ্গুলগুলি নিয়ে চিন্তা করতে হবে না, তবে আপনি এখনও একটি ওআরএম পাবেন।


1

বন্ধু আমারও একই প্রশ্ন ছিল এবং সেগুলি কীভাবে ব্যবহার করতে হয় তা বুঝতে সক্ষম হয়েছি।

আমি ORM সিক্যুয়ালাইজ ছাড়াই শুরু করেছি তাই ইতিমধ্যে আমার কাছে একটি ডেটা মডেল ছিল।
আমাকে সিক্যুয়ালাইজ-অটো দিয়ে স্বয়ংক্রিয়ভাবে মডেলগুলি তৈরি করতে হয়েছিল এবং আপনি এই ফাইলটি দিয়ে https://gist.github.com/ahelord/a7a7d293695b71aadf04157f0f7dee64 তৈরি করেছেন এবং সিঙ্কে রেখেছিলেন ( {Force: false})
এটি ডিভাইসে আছে I মডেল এবং মাইগ্রেশন এবং প্রত্যেকবার আমি কোডটি টানলে এগুলি সম্পাদন করে।

উত্পাদনে সার্ভারটি কেবল উপরে উপরে থাকে সুতরাং আপনাকে কেবল মাইগ্রেশন চালাতে হবে এবং প্রতিটি কমিটে পরিচালনা করতে হবে যেমন আপনি ব্যাকএন্ডটি না থামিয়ে মডেলটির সংস্করণ করবেন


1

আমি এই পোস্ট এবং অনুরূপ প্রশ্নগুলির মধ্য দিয়ে গিয়েছিলাম, এটি আমার পক্ষে সত্যিই উত্তর দেয় না। স্থানীয় ডাটাবেস কাটানোর জন্য এবং উত্পাদনে ডেটা আপডেট করার জন্য মাইগ্রেশন কার্যকর

আমি এখানে প্রশ্ন জিজ্ঞাসা করেছি এবং এর উত্তরও দিয়েছি: দিয়েছি সিক্যুয়ালাইজ মাইগ্রেশন এবং ইনিশাইজেশনকে পরিচালনা করার জন্য কর্মপ্রবাহ?

গ্রিনফিল্ড প্রকল্পের জন্য টিএল-ডিআর সংস্করণ

  1. আপনার ডাটাবেস স্কিমাটি ডিজাইন করুন যেমন আপনি প্রথাগতভাবে খাঁটি এসকিউএল স্ক্রিপ্ট ব্যবহার করেন বা আপনি যদি এর পরিবর্তে কোনও গুই সরঞ্জাম ব্যবহার করেন
  2. আপনি যখন আপনার 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. এখন আপনার সিক্যুয়ালাইজ সেটআপটি আপনার প্রাথমিক ডাটাবেস স্কিমার সাথে সিঙ্ক হয়েছে
  2. আপনি যখন আপনার ডাটাবেস স্কিমা সম্পাদনা করতে চান, এটি আবার চালান sequelize migration:generate --name [name_of_your_migration]
  3. এগিয়ে যান upএবং downমাইগ্রেশন পথে আপনার পরিবর্তনগুলি এখানে করুন । কলামের নাম, মুছুন, কলাম কলাম ইত্যাদি পাল্টানোর জন্য এগুলি আপনার বিকল্প বিবরণী
  4. চালান sequelize db:migrate
  5. আপনি চাইলে মডেলগুলি আপনার দূরবর্তী ডিবিতে পরিবর্তনের জন্য সিঙ্ক হয়, তাই এখন আপনি যা করতে পারেন তা হ'ল npm install sequelize-auto
  6. এটি আপনার ডাটাবেসে বর্তমান ডাটাবেস স্কিমা পড়বে এবং মডেল ফাইলগুলি স্বয়ংক্রিয় উত্পন্ন করবে। Https://github.com/sequelize/sequelize-auto এরsequelize-auto -o "./models" -d sequelize_auto_test -h localhost -u my_username -p 5432 -x my_password -e postgres অধীনে এটির অনুরূপ একটি কমান্ড ব্যবহার করুন

আপনি আপনার মডেলটিতে ডিফ্লোগগুলি দেখতে গিট ব্যবহার করতে পারেন, ডাটাবেস মডেলটিতে পরিবর্তনগুলি প্রতিফলিত করে কেবল সেখানে পরিবর্তন হওয়া উচিত। পার্শ্ব নোট হিসাবে, modelsআপনি যদি ব্যবহার করেন তবে সরাসরি কখনও সংশোধন করবেন না sequelize auto, কারণ এটি সেগুলি আপনার জন্য উত্পন্ন করবে। তেমনি, আপনার আর আপনার ডাটাবেস স্কিমাটি সরাসরি এসকিউএল ফাইলগুলির মাধ্যমে পরিবর্তন করা উচিত নয়, মঞ্জুর করা এই বিকল্প হিসাবে আপনি এটিগুলি আমদানি করতে পারেন.sql ফাইলগুলিও

এখন আপনার ডাটাবেস স্কিমা আপ টু ডেট এবং আপনি আনুষ্ঠানিকভাবে কেবল ডাটাবেস স্থানান্তরগুলি সিক্যুয়ালাইজ করতে চলে এসেছেন।

সবকিছু সংস্করণ নিয়ন্ত্রিত হয়। এটি ডাটাবেস এবং ব্যাকএন্ড বিকাশকারীদের জন্য আদর্শ ওয়ার্কফ্লো


0

আরও সহজ উপায় আছে (সিক্যালাইজ এড়ানো)। যা এর মতো হয়:

  1. আপনি আপনার প্রকল্পের ভিতরে একটি কমান্ড টাইপ করেছেন: এনএমপি রান মাইগ্রেট: নতুন

  2. এটি 3 টি ফাইল তৈরি করে। একটি জেএস ফাইল এবং উপরে এবং নীচে দুটি স্কুয়েল ফাইল

  3. আপনি আপনার এসকিউএল স্টেটমেন্টটি সেই ফাইলগুলিতে রেখেছেন যা খাঁটি এসকিউএল
  4. তারপরে আপনি টাইপ করুন: এনএমপি রান মাইগ্রেট: আপ বা এনপিএম রান মাইগ্রেট: ডাউন

এটি কাজ করার জন্য, দয়া করে ডিবি-মাইগ্রেশনটি দেখুন মডিউলটি দেখুন।

এটি সেটআপ হয়ে গেলে (যা কঠিন নয়), আপনার ডিবি পরিবর্তন করা সত্যিই সহজ এবং প্রচুর সময় সাশ্রয় করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.