【发布时间】:2023-03-12 08:42:01
【问题描述】:
我正在创建一个需要自己的 SQL 表的 mediawiki 扩展。在扩展中创建它的正确方法是什么,我是否需要像 OATHAuth extension 那样为我想要支持的每个数据库创建单独的 SQL 代码?这似乎不是正确的方法。
(OATHAuth 钩子onLoadExtensionSchemaUpdates)
【问题讨论】:
标签: mediawiki mediawiki-extensions
我正在创建一个需要自己的 SQL 表的 mediawiki 扩展。在扩展中创建它的正确方法是什么,我是否需要像 OATHAuth extension 那样为我想要支持的每个数据库创建单独的 SQL 代码?这似乎不是正确的方法。
(OATHAuth 钩子onLoadExtensionSchemaUpdates)
【问题讨论】:
标签: mediawiki mediawiki-extensions
对于扩展的架构更改,LoadExtensionSchemaUpdates hook page 是查看的正确位置。
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 file。
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;
}
【讨论】:
是的,您确实需要为每个受支持的数据库引擎提供一个补丁文件。理论上它可能是同一个补丁文件,实际上通常存在细微的语法差异,需要单独的文件。有一些planned changes 用抽象的模式更改替换当前的模式更新系统,这样扩展开发人员就不必处理数据库引擎的差异,但这需要一段时间才能发生。
实际上,大多数扩展仅通过支持 MySQL 和 Postgres 来处理这个问题。
【讨论】: