@harrasteblogi JUURI NYT
--:--

Tilaa uutiskirje

Saat tuoreimmat 10 uusinta artikkelia kerran viikossa sähköpostiisi.

Tilaa uutiskirje

Tietokantamigraatiot WordPress-plugin-kehityksessäTietokantamigraatiot ovat yksi WordPress-plugin-kehityksen kriittisimmistä, mutta usein huonoimmin toteutetuista osa-alueista. Ilman hallittua migraatiomallia pluginien päivitykset muuttuvat helposti riskialttiiksi: taulut jäävät päivittämättä, sarakkeet rikkoutuvat tai data muuttuu epäyhteensopivaksi eri versioiden välillä.

Tiivistelmä
Miksi migraatiot ovat WordPressissä haastavia

WordPress ei tarjoa “virallista migration frameworkia”, joten kehittäjä joutuu itse rakentamaan mallin....

Perusperiaate: versionointi on kaikki

Jokainen plugin tarvitsee tietokantaversion....

Migration runner -malli

Yksinkertainen arkkitehtuuri:...

update hook (tärkeä osa)

add_action('plugins_loaded', 'myplugin_migrate'); Tämä varmistaa, että migraatiot ajetaan jokaisessa päivityksessä....

Incremental migrations (paras käytäntö)

Jokainen versio on oma askel:...

Pitkät migraatiot ja performance

Älä aja raskaita migraatioita suoraan requestissa....

Batch migration esimerkki

$rows = $wpdb->get_results(" SELECT id FROM $table LIMIT 100 "); Queue-pohjainen migraatio (skaalautuva malli) Suuremmissa plugineissa:...

Safe migrations (rollback-ajattelu)

WordPress ei tarjoa natiivia rollbackia, joten:...

Esimerkki idempotentista migraatiosta

if (!$wpdb->get_results("SHOW COLUMNS FROM $table LIKE 'new_column'")) { $wpdb->query("ALTER TABLE $table ADD new_column TEXT"); } Indeksien hallinta Suurissa tietokannoissa indeksit ovat kriittisiä....

Indeksien hallinta

Suurissa tietokannoissa indeksit ovat kriittisiä....

Foreign keyt WordPressissä

WordPress ei käytä niitä oletuksena, mutta pluginissa voi:...

Multisite migraatiot

Multisite lisää kompleksisuutta:...

Logging migraatioissa

error_log('Migration 1.2.0 started'); Parempi:...

Yleisimmät virheet

Kestävä malli sisältää:...

Hyvä migraatioarkkitehtuuri

Kestävä malli sisältää:...

Yhteenveto

Tietokantamigraatiot WordPress-plugin-kehityksessä vaativat selkeän versionhallinnan, hallitun suoritusmallin ja huolellisen erottelun schema- ja datamuutosten välillä. Ilman näitä pluginien päivitykset muuttuvat helposti epäluotettaviksi ja vaikeasti ylläpidettäviksi....

Hyvin suunniteltu migraatiojärjestelmä tekee plugineista ennustettavia, päivitettäviä ja tuotantovarmoja.

Miksi migraatiot ovat WordPressissä haastavia

WordPress ei tarjoa “virallista migration frameworkia”, joten kehittäjä joutuu itse rakentamaan mallin.

Tyypillisiä ongelmia:

  • plugin päivittyy ilman schema-päivitystä
  • dbDelta käyttäytyy epäluotettavasti
  • vanhat versiot eivät päivity oikein
  • rollback ei ole mahdollinen
  • useita versioita samasta tietomallista
  • multisite-kompleksisuus

Perusperiaate: versionointi on kaikki

Jokainen plugin tarvitsee tietokantaversion.

define('MYPLUGIN_DB_VERSION', '1.2.0');

Tallennus:

update_option('myplugin_db_version', MYPLUGIN_DB_VERSION);

Migration runner -malli

Yksinkertainen arkkitehtuuri:

  • tarkista nykyinen versio
  • vertaa uuteen versioon
  • suorita tarvittavat migraatiot
  • päivitä versionumero
function myplugin_migrate() {

    $current = get_option('myplugin_db_version');

    if (version_compare($current, '1.1.0', '<')) {
        myplugin_migrate_110();
    }

    if (version_compare($current, '1.2.0', '<')) {
        myplugin_migrate_120();
    }

    update_option('myplugin_db_version', MYPLUGIN_DB_VERSION);
}

dbDelta – hyödyllinen mutta epäluotettava

WordPress tarjoaa:

dbDelta($sql);

Hyödyt:

  • luo ja päivittää tauluja
  • helppo käyttää

Haitat:

  • ei aina päivitä sarakkeita oikein
  • epädeterministinen SQL-parsinta
  • ei tue monimutkaisia muutoksia hyvin

Siksi sitä kannattaa käyttää vain perus-schemaan.

Taulujen luonti oikein

Esimerkki:

function myplugin_create_table() {

    global $wpdb;

    $table = $wpdb->prefix . 'myplugin_data';

    $charset = $wpdb->get_charset_collate();

    $sql = "CREATE TABLE $table (
        id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
        user_id BIGINT UNSIGNED NOT NULL,
        value TEXT NOT NULL,
        created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
        PRIMARY KEY (id),
        KEY user_id (user_id)
    ) $charset;";

    require_once ABSPATH . 'wp-admin/includes/upgrade.php';
    dbDelta($sql);
}

Activation hook migraatioille

Yleinen malli:

register_activation_hook(__FILE__, 'myplugin_migrate');

Mutta tämä ei riitä yksinään, koska:

  • plugin voi päivittyä ilman reaktivointia
  • migraatioita pitää ajaa myös update-hookissa

update hook (tärkeä osa)

add_action('plugins_loaded', 'myplugin_migrate');

Tämä varmistaa, että migraatiot ajetaan jokaisessa päivityksessä.

Incremental migrations (paras käytäntö)

Jokainen versio on oma askel:

1.0.0 → 1.1.0 → 1.2.0 → 1.3.0

Ei koskaan:

suoraan 1.0.0 → 1.3.0 ilman väliaskelia

Data migration vs schema migration

Erotus on tärkeä:

Schema migration

  • taulut
  • sarakkeet
  • indeksit

Data migration

  • vanhan datan muunnos
  • format change
  • normalization

Esimerkki:

function myplugin_migrate_120() {

    global $wpdb;

    $table = $wpdb->prefix . 'myplugin_data';

    $wpdb->query("
        UPDATE $table
        SET value = LOWER(value)
    ");
}

Pitkät migraatiot ja performance

Älä aja raskaita migraatioita suoraan requestissa.

Ongelma:

  • timeout
  • memory limit
  • admin slowdown

Parempi:

  • background processing
  • batch migraatiot
  • WP-Cron tai Action Scheduler

Batch migration esimerkki

$rows = $wpdb->get_results("
    SELECT id FROM $table LIMIT 100
");

Queue-pohjainen migraatio (skaalautuva malli)

Suuremmissa plugineissa:

  • Redis queue
  • Action Scheduler
  • custom worker

Tämä estää adminin hidastumisen.

Safe migrations (rollback-ajattelu)

WordPress ei tarjoa natiivia rollbackia, joten:

  • backup ennen migraatiota
  • version lock
  • idempotentit migraatiot

Idempotentti tarkoittaa:

sama migraatio voidaan ajaa useita kertoja ilman vahinkoa

Esimerkki idempotentista migraatiosta

if (!$wpdb->get_results("SHOW COLUMNS FROM $table LIKE 'new_column'")) {
    $wpdb->query("ALTER TABLE $table ADD new_column TEXT");
}

Indeksien hallinta

Suurissa tietokannoissa indeksit ovat kriittisiä.

ALTER TABLE wp_myplugin_data ADD INDEX user_id (user_id);

Huonot indeksit = hidas admin ja API.

Foreign keyt WordPressissä

WordPress ei käytä niitä oletuksena, mutta pluginissa voi:

  • lisätä viite-eheyksiä
  • mutta pitää varoa performancea ja dbDelta-yhteensopivuutta

Multisite migraatiot

Multisite lisää kompleksisuutta:

  • jokainen site = oma schema
  • network-level migraatiot
  • loop kaikille blogeille
foreach (get_sites() as $site) {
    switch_to_blog($site->blog_id);
    myplugin_migrate();
    restore_current_blog();
}

Version locking ja turvallisuus

Tärkeää:

  • älä päivitä versionumeroa ennen onnistunutta migraatiota
  • käytä try/catch-logiikkaa
  • logita virheet

Logging migraatioissa

error_log('Migration 1.2.0 started');

Parempi:

  • oma log-taulu
  • admin alert
  • monitoring (New Relic, Sentry)

Yleisimmät virheet

  • kaikki migraatiot dbDelta:lla
  • ei versionhallintaa
  • ei batch processingia
  • raskaat update-queryt ilman rajoituksia
  • migraatiot ajetaan jokaisella requestilla
  • ei rollback-strategiaa
  • multisite unohdetaan

Hyvä migraatioarkkitehtuuri

Kestävä malli sisältää:

  • version-based migrations
  • schema + data separation
  • batch processing
  • background queue
  • logging ja monitoring
  • idempotentit operaatiot
  • safe activation hooks

Yhteenveto

Tietokantamigraatiot WordPress-plugin-kehityksessä vaativat selkeän versionhallinnan, hallitun suoritusmallin ja huolellisen erottelun schema- ja datamuutosten välillä. Ilman näitä pluginien päivitykset muuttuvat helposti epäluotettaviksi ja vaikeasti ylläpidettäviksi.

Kun migraatiot rakennetaan vaiheittaisiksi, idempotenteiksi ja tarvittaessa taustalla ajettaviksi prosesseiksi, WordPress-pluginista tulee huomattavasti vakaampi ja skaalautuvampi myös suurissa ympäristöissä.

🍪