আমার স্কিমাটি কোন ডাটাবেসে তৈরি করা উচিত তা আমি কীভাবে নির্দিষ্ট করব?


12

দ্রুপাল in এ একাধিক ডাটাবেস ব্যবহার করার সময় , আমি কীভাবে নির্দিষ্ট করতে পারি যে একটি আলাদা সার্ভারে একটি আলাদা ডাটাবেসে একটি টেবিল তৈরি করতে হবে?

ডিফল্টরূপে, আপনি যখন কোনও মডিউল ইনস্টল করেন, দ্রুপাল ধরে নেন যে সমস্ত কিছু hook_schema()ডিফল্ট ডাটাবেসে ইনস্টল করা উচিত। কোনও উপাত্ত একটি আলাদা ডাটাবেসে তৈরি করা উচিত তা নির্দিষ্ট করার কোনও উপায় আছে, বা আমি ব্যবহার করতে পারি এমন কোনও ধরণের ম্যানুয়াল ওয়ার্কআউন্ড রয়েছে?


আমার প্রাথমিক ধারণাটি হ'ল আপনি এপিআই পর্যায়ে এটি করতে পারবেন না। আপনার মডিউলটি একটি নির্দিষ্ট এবং বিরল ডাটাবেস কনফিগারেশনের সাথে আবদ্ধ হওয়ার কারণ। আমি ধরে নিলাম এটি কোনও সাইট নির্দিষ্ট মডিউল? আমি বিশ্বাস করি যে আপনার ফিক্সটিও সাইট / ডিবি-কনফিগারেশন নির্দিষ্ট হওয়া দরকার।
লেটারিয়ান

উত্তর:


4

আমি মনে করি না একটি অফিসিয়াল এপিআই আছে; এটি সাধারণভাবে এটি করতে খুব বেশি অর্থবোধ করে না।

এটি বলেছিল, আপনাকে যা করতে হবে তা হ'ল (মুলত আপনি যা চান, তার hook_schemaচেয়ে আলাদা ) এবং তারপরে হুক_ইনস্টল () এর মধ্যে প্রথমে আপনার ডাটাবেসটি স্যুইচ করুন , তারপরে drupal_install_schema () যা করে তা আপনার কাস্টম স্কিমা সংজ্ঞা হিসাবে কল না করে প্রতিলিপি করুন ফাংশন এবং তারপরে ডাটাবেসটিকে ডিফল্টে ফিরে যেতে হবে।yourmodule_schemayourmodule_schema_otherdb

এছাড়াও, বাস্তবায়ন মনে রাখবেন hook_uninstall()

আপনি কেন এটি করতে চান তা জানেন না। :)


উদ্দেশ্যটি (এই ক্ষেত্রে) দ্রুততর হচ্ছে, তবে আপনি এটি করতে চাইলে প্রচুর বৈধ কারণগুলি আমি ভাবতে পারি। এই ঘাটতির আশেপাশে এটি কতটা সমস্যায় পড়বে তা প্রদত্ত, আমি মনে করি আমি এটির CREATE TABLEজন্য একটি বিবৃতি লিখতে শেষ করব ।
মিক্ল

যার জন্য আপনাকে সংশ্লিষ্ট হুক_উইনস্টল () লিখতে হবে পাশাপাশি আপনি যদি এটি সঠিকভাবে করতে চান তবে :) নিশ্চিত নই যে আপনি যে সমস্যাগুলির কথা বলছেন তা আমি দেখেছি, আপনার যা করা দরকার তা হুক_নেবল (যা আপনাকে 6 সালে করতে হয়েছিল তা বাস্তবায়ন করা উচিত) .x পাশাপাশি) এবং drupal_install_schema () তে কোডের কয়েকটি লাইন অনুলিপি করুন এবং সামঞ্জস্য করুন। বিশেষত যদি আপনি চান যে আপনার টেবিলগুলি একাধিক ডাটাবেসে প্রদর্শিত হতে পারে, আপনি এমনকি এটি অন্যান্য ডাটাবেসের জন্য এটি ডিফল্ট ডাটাবেসে এবং হুক_ইনস্টল () এ ব্যবহার করতে হুক_স্কেমা () ব্যবহার করতে পারেন। এমনকি আপনি ডিবি স্যুইচিংয়ের মধ্যে কেবলমাত্র ড্রুপাল_ইনস্টল_স্কেমা ($ yourmodule) কল করতে সক্ষম হতে পারেন।
বারদির

11

বারদিরের দেওয়া তথ্য দিয়ে আমি এটি অর্জন করেছি । আমার কোডটি দেখে মনে হচ্ছে:

<?php
function mymodule_schema_otherdb() {
  $schema['mytable'] = array(
    'description' => 'My table description',
    'fields' => array(
      'myfield' => array(
        'description' => 'My field description',
        'type' => 'serial',
        'size' => 'medium',
        'not null' => TRUE,
        'unsigned' => TRUE,
      ),
    ),
    'primary key' => array('myfield'),
  );
  return $schema;
}

function mymodule_install() {
  db_set_active('otherdb');
  $schema = mymodule_schema_otherdb();
  foreach ($schema as $name => $table) {
    db_create_table($name, $table);
  }
  db_set_active();
}

function mymodule_uninstall() {
  db_set_active('otherdb');
  $schema = mymodule_schema_otherdb();
  foreach ($schema as $name => $table) {
    db_drop_table($name);
  }
  db_set_active();
}

এমন একটি মডিউল পাওয়া খুব বেশি কাজ হবে না যা ইনস্টল এবং আনইনস্টল করার জন্য সেই হুক এবং আগুনের সন্ধান করে। অন্যান্য ডিবি স্কিমা কাঠামোর মূল কী হিসাবে রয়েছে
জেরেমি ফরাসী

@ জেরেমিফ্রান্স, এই সেটআপটির জন্য কী ফাঁকা ডাটাবেস আগে থেকেই তৈরি করা দরকার? আমি তাই ধরে নিচ্ছি।
জেকেন্ট

1

@ Елин Й দ্বারা সরবরাহিত * .ইনস্টল ফাইল কোডের একটি ড্রুপাল 8 সংস্করণ :

দ্রষ্টব্য: ডাটাবেস অবশ্যই উপস্থিত থাকতে হবে এবং সেটিংস.এফপিতে নির্দিষ্ট করা উচিত।

<?php
function mymodule_schema_otherdb() {
  $schema['mytable'] = array(
    'description' => 'My table description',
    'fields' => array(
      'myfield' => array(
        'description' => 'My field description',
        'type' => 'serial',
        'size' => 'medium',
        'not null' => TRUE,
        'unsigned' => TRUE,
      ),
    ),
    'primary key' => array('myfield'),
  );
  return $schema;
}

/**
 * Implements hook_install().
 */
function mymodule_install() {
  \Drupal\Core\Database\Database::setActiveConnection('otherdb');
  $connection = \Drupal\Core\Database\Database::getConnection();

  $schema = mymodule_schema_shared();
  foreach ($schema as $name => $table) {
    $connection->schema()->createTable($name, $table);
  }

  \Drupal\Core\Database\Database::setActiveConnection();
}

/**
 * Implements hook_uninstall().
 */
function mymodule_uninstall() {
  \Drupal\Core\Database\Database::setActiveConnection('otherdb');
  $connection = \Drupal\Core\Database\Database::getConnection();

  $schema = mymodule_schema_shared();
  foreach ($schema as $name => $table) {
    $connection->schema()->dropTable($name);
  }

  \Drupal\Core\Database\Database::setActiveConnection();
}

এখানে একটি ব্যাপার সারকথা


-2

সেটিংস.এফপি
$db_url=array('default'=>$db_url, 'sec_db'=>$sec_db_url);
ইন-এ hook_schema db_set_active('sec_db')এখন আপনার অন্য ডিবিতে সংযুক্ত হবে, এটির পরামর্শ দেওয়া হয় কিনা বা আপনার নিজের ঝুঁকিতে চেষ্টা করে দেখুন কিনা তা নিশ্চিত হন না। এবং আপনি এই মাধ্যমিক ডিবি থেকে কোয়েরি করতে db_prefix ব্যবহার করতে পারেন। আপনি settings.php এ ডিবি উপসর্গ ব্যবহার করতে পারেন


এটি সিস্টেম বিস্তৃত হবে, যা ওপি ইতিমধ্যে করতে পারে
ক্লাইভ

সিস্টেম প্রশস্ত কি হবে? দয়া করে স্পষ্ট করুন
গুডএসপিএনডি

1
এই শব্দার্থবিদ্যা ( $db_url, $db_prefixএকটি বিশ্বব্যাপী সেটিং হিসেবে Drupal এর 6. জন্য এবং ডট স্বরলিপি শুধুমাত্র কাজ করে একটি ভিন্ন ডাটাবেসের ব্যবহার করে একই মাইএসকিউএল সার্ভারে না যখন (আমার ক্ষেত্রে) আপনি বিভিন্ন সার্ভার অ্যাক্সেস হিসাবে।
mikl

@ কান্টু ওপি একটি নির্দিষ্ট সারণির ডাটাবেস কীভাবে পরিবর্তন করবেন তা জিজ্ঞাসা করছে। আপনার আসল সমাধান (আপনি সম্পাদনার আগে) পরিবর্তনটি সিস্টেম-প্রশস্ত করে ফেলতেন, টেবিল-টেবিলের ভিত্তিতে নয়।
ক্লাইভ

2
এবং যেমনটি আমি আগেই বলেছি, ড্রুপাল 7 এ কোনও $db_urlবা বৈশ্বিক $db_prefixপরিবর্তনশীল নেই, এবং সেখানে থাকলেও এটি সমস্যার সমাধান করবে না।
মিক্ল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.