इसे छोड़कर कंटेंट पर जाएं

डेटाबेस माइग्रेशन

डेटाबेस माइग्रेशन आपके डेटाबेस स्कीमा में संस्करण-नियंत्रित, प्रतिवर्ती परिवर्तन प्रदान करता है। वे विकास, स्टेजिंग और उत्पादन वातावरण में सुसंगत डेटाबेस स्थिति सुनिश्चित करते हैं।

migrations/
├── 001_create_articles_table.php
├── 002_add_status_column.php
├── 003_create_categories_table.php
├── 004_add_indexes.php
└── 005_add_foreign_keys.php

माइग्रेशन क्लास

Section titled “माइग्रेशन क्लास”
migrations/001_create_articles_table.php
<?php
declare(strict_types=1);
return new class {
public function up(\XoopsDatabase $db): void
{
$table = $db->prefix('mymodule_articles');
$sql = "CREATE TABLE IF NOT EXISTS `{$table}` (
`id` VARCHAR(26) NOT NULL COMMENT 'ULID identifier',
`title` VARCHAR(255) NOT NULL,
`content` MEDIUMTEXT,
`status` ENUM('draft', 'published', 'archived') DEFAULT 'draft',
`author_id` INT UNSIGNED NOT NULL,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_status` (`status`),
KEY `idx_author` (`author_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci";
$db->queryF($sql);
}
public function down(\XoopsDatabase $db): void
{
$table = $db->prefix('mymodule_articles');
$db->queryF("DROP TABLE IF EXISTS `{$table}`");
}
};
public function up(\XoopsDatabase $db): void
{
$table = $db->prefix('mymodule_articles');
// Add single column
$db->queryF("ALTER TABLE `{$table}` ADD COLUMN `views` INT UNSIGNED DEFAULT 0 AFTER `status`");
// Add multiple columns
$db->queryF("ALTER TABLE `{$table}`
ADD COLUMN `summary` TEXT AFTER `content`,
ADD COLUMN `featured` TINYINT(1) DEFAULT 0 AFTER `views`");
}
public function down(\XoopsDatabase $db): void
{
$table = $db->prefix('mymodule_articles');
$db->queryF("ALTER TABLE `{$table}` DROP COLUMN `views`, DROP COLUMN `summary`, DROP COLUMN `featured`");
}

कॉलम संशोधित करना

Section titled “कॉलम संशोधित करना”
public function up(\XoopsDatabase $db): void
{
$table = $db->prefix('mymodule_articles');
// Change column type
$db->queryF("ALTER TABLE `{$table}` MODIFY COLUMN `title` VARCHAR(500) NOT NULL");
// Rename column
$db->queryF("ALTER TABLE `{$table}` CHANGE `summary` `excerpt` TEXT");
}

अनुक्रमणिकाएँ जोड़ना

Section titled “अनुक्रमणिकाएँ जोड़ना”
public function up(\XoopsDatabase $db): void
{
$table = $db->prefix('mymodule_articles');
// Single column index
$db->queryF("CREATE INDEX `idx_created` ON `{$table}` (`created_at`)");
// Composite index
$db->queryF("CREATE INDEX `idx_status_date` ON `{$table}` (`status`, `created_at`)");
// Unique index
$db->queryF("CREATE UNIQUE INDEX `idx_slug` ON `{$table}` (`slug`)");
// Fulltext index
$db->queryF("CREATE FULLTEXT INDEX `idx_search` ON `{$table}` (`title`, `content`)");
}
public function down(\XoopsDatabase $db): void
{
$table = $db->prefix('mymodule_articles');
$db->queryF("DROP INDEX `idx_created` ON `{$table}`");
$db->queryF("DROP INDEX `idx_status_date` ON `{$table}`");
$db->queryF("DROP INDEX `idx_slug` ON `{$table}`");
$db->queryF("DROP INDEX `idx_search` ON `{$table}`");
}

विदेशी कुंजियाँ

Section titled “विदेशी कुंजियाँ”
public function up(\XoopsDatabase $db): void
{
$articles = $db->prefix('mymodule_articles');
$categories = $db->prefix('mymodule_categories');
$db->queryF("ALTER TABLE `{$articles}`
ADD CONSTRAINT `fk_article_category`
FOREIGN KEY (`category_id`) REFERENCES `{$categories}` (`id`)
ON DELETE SET NULL ON UPDATE CASCADE");
}
public function down(\XoopsDatabase $db): void
{
$articles = $db->prefix('mymodule_articles');
$db->queryF("ALTER TABLE `{$articles}` DROP FOREIGN KEY `fk_article_category`");
}

रनिंग माइग्रेशन

Section titled “रनिंग माइग्रेशन”
include/onupdate.php
function xoops_module_update_mymodule(\XoopsModule $module, $previousVersion)
{
$db = \XoopsDatabaseFactory::getDatabaseConnection();
$migrator = new MigrationRunner($db, $module->dirname());
try {
$migrator->migrate();
return true;
} catch (\Exception $e) {
$module->setErrors($e->getMessage());
return false;
}
}

माइग्रेशन रनर क्लास

Section titled “माइग्रेशन रनर क्लास”
class MigrationRunner
{
private string $migrationsPath;
private string $table;
public function __construct(
private \XoopsDatabase $db,
private string $moduleName
) {
$this->migrationsPath = XOOPS_ROOT_PATH . "/modules/{$moduleName}/migrations";
$this->table = $db->prefix("{$moduleName}_migrations");
}
public function migrate(): void
{
$this->createMigrationsTable();
$executed = $this->getExecutedMigrations();
foreach ($this->getPendingMigrations($executed) as $file) {
$this->runMigration($file);
}
}
private function runMigration(string $file): void
{
$migration = require $this->migrationsPath . '/' . $file;
$migration->up($this->db);
$this->db->queryF(
"INSERT INTO `{$this->table}` (migration, executed_at) VALUES (?, NOW())",
[$file]
);
}
public function rollback(int $steps = 1): void
{
$migrations = $this->getExecutedMigrations();
$toRollback = array_slice(array_reverse($migrations), 0, $steps);
foreach ($toRollback as $file) {
$migration = require $this->migrationsPath . '/' . $file;
$migration->down($this->db);
$this->db->queryF(
"DELETE FROM `{$this->table}` WHERE migration = ?",
[$file]
);
}
}
}

सर्वोत्तम प्रथाएँ

Section titled “सर्वोत्तम प्रथाएँ”
  1. प्रति माइग्रेशन एक परिवर्तन - माइग्रेशन पर ध्यान केंद्रित रखें
  2. हमेशा तरीके लिखें - रोलबैक सक्षम करें
  3. दोनों दिशाओं का परीक्षण करें - up() और down() सत्यापित करें
  4. लेन-देन का उपयोग करें - जटिल माइग्रेशन लपेटें
  5. पुराने माइग्रेशन को संशोधित न करें - इसके बजाय नए माइग्रेशन बनाएं
  6. दौड़ने से पहले बैकअप लें - विशेष रूप से उत्पादन में

संबंधित दस्तावेज़ीकरण

Section titled “संबंधित दस्तावेज़ीकरण”
  • डेटाबेस-स्कीमा - स्कीमा डिज़ाइन
  • डेटाबेस-संचालन - क्वेरी निष्पादन
  • ../xoops_version.php - मॉड्यूल मेनिफेस्ट
  • ../../07-XOOPS-4.0/XOOPS-4.0-आर्किटेक्चर - आधुनिक वास्तुकला