Правильный способ создания новой таблицы SQL в расширении MediaWiki - PullRequest
0 голосов
/ 03 ноября 2019

Я создаю расширение mediawiki, для которого нужна собственная таблица SQL. Как правильно создать его в расширении, и нужно ли создавать отдельный код SQL для каждой базы данных, которую я хочу поддерживать, как это делает расширение OATHAuth ? Это не похоже на правильный подход.

(OATHAuth перехватывает onLoadExtensionSchemaUpdates)

Ответы [ 2 ]

1 голос
/ 03 ноября 2019

Да, вам нужен файл патча для каждого поддерживаемого механизма БД. Теоретически это может быть один и тот же файл исправлений, на практике обычно существуют тонкие синтаксические различия, которые требуют отдельных файлов. Существуют запланированные изменения для замены текущей системы обновления схемы на изменения абстрактной схемы, чтобы разработчикам расширений не приходилось сталкиваться с различиями в механизмах БД, но для этого потребуется некоторое время.

На практике большинство расширений решают эту проблему, поддерживая только MySQL и, возможно, Postgres.

1 голос
/ 03 ноября 2019

В случае изменения схемы для расширения, 1002 * LoadExtensionSchemaUpdates страница подключения - правильное место для поиска.

LoadExtensionSchemaUpdates подключение

запускается при обновлении MediaWiki (php maintenance / update.php), чтобы позволить расширениям обновлять базу данных

Если вы посмотрите на ArticleFeedbackv5. sql file , вот как должен выглядеть sql file

CREATE TABLE IF NOT EXISTS /*_*/aft_feedback (
      -- id is no auto-increment, but a in PHP generated unique value
      aft_id binary(32) NOT NULL PRIMARY KEY,
      aft_page integer unsigned NOT NULL,
    ...
    ) /*$wgDBTableOptions*/;

    -- sort indexes (central feedback page; lots of data - more details indexes for most popular actions)
    CREATE INDEX /*i*/relevance ON /*_*/aft_feedback (aft_relevance_score, aft_id, aft_has_comment, aft_oversight, aft_archive, aft_hide);
    CREATE INDEX /*i*/age ON /*_*/aft_feedback (aft_timestamp, aft_id, aft_has_comment, aft_oversight, aft_archive, aft_hide);
    CREATE INDEX /*i*/helpful ON /*_*/aft_feedback (aft_net_helpful, aft_id, aft_has_comment, aft_oversight, aft_archive, aft_hide);

    -- page-specific
    CREATE INDEX /*i*/relevance_page ON /*_*/aft_feedback (aft_page, aft_relevance_score);
    CREATE INDEX /*i*/age_page ON /*_*/aft_feedback (aft_page, aft_timestamp);
    CREATE INDEX /*i*/helpful_page ON /*_*/aft_feedback (aft_page, aft_net_helpful);

    -- index for archive-job
    CREATE INDEX /*i*/archive_queue ON /*_*/aft_feedback (aft_archive, aft_archive_date);

    -- index for mycontribs data
    CREATE INDEX /*i*/contribs ON /*_*/aft_feedback (aft_user, aft_timestamp);
    CREATE INDEX /*i*/contribs_anon ON /*_*/aft_feedback (aft_user, aft_user_text, aft_timestamp);

И затем вы ссылаетесь на этот файл в hook в файле хука

public static function loadExtensionSchemaUpdates( $updater = null ) {
            // that's for adding a table
            $updater->addExtensionTable(
                'aft_feedback',
                dirname( __FILE__ ) . '/sql/ArticleFeedbackv5.sql' //that's the previous sql file
            );
            ...
}

Не забудьте добавить хук в секцию хука в вашем файле extension.json. Таблица будет создана, когда вы запустите файл update.php.

Что касается вашего вопроса о создании файла для каждого механизма базы данных, мы не можем использовать один и тот же файл для каждого из них, так как могут быть некоторыеразличия в запросах. Посмотрите, что сказал Tgr .

Если вы еще этого не сделали, взгляните на файл hook .

protected function execute() {
        switch ( $this->updater->getDB()->getType() ) {
            case 'mysql':
            case 'sqlite':
                $this->updater->addExtensionTable( 'oathauth_users', "{$this->base}/sql/mysql/tables.sql" );
                $this->updater->addExtensionUpdate( [ [ $this, 'schemaUpdateOldUsersFromInstaller' ] ] );
                $this->updater->dropExtensionField(
                    'oathauth_users',
                    'secret_reset',
                    "{$this->base}/sql/mysql/patch-remove_reset.sql"
                );
                $this->updater->addExtensionField(
                    'oathauth_users',
                    'module',
                    "{$this->base}/sql/mysql/patch-add_generic_fields.sql"
                );
                $this->updater->addExtensionUpdate(
                    [ [ __CLASS__, 'schemaUpdateSubstituteForGenericFields' ] ]
                );
                $this->updater->dropExtensionField(
                    'oathauth_users',
                    'secret',
                    "{$this->base}/sql/mysql/patch-remove_module_specific_fields.sql"
                );
                /*$this->updaterAddExtensionUpdate(
                    [ [ __CLASS__, 'schemaUpdateTOTPToMultipleKeys' ] ]
                );*/
                break;
            case 'oracle':
                $this->updater->addExtensionTable( 'oathauth_users', "{$this->base}/sql/oracle/tables.sql" );
                break;
            case 'postgres':
                $this->updater->addExtensionTable( 'oathauth_users', "{$this->base}/sql/postgres/tables.sql" );
                break;
        }
        return true;
    }
...