数据库增量失败,错误为:“WordPress数据库错误表‘wp_2_myPlugin’已存在

时间:2012-02-05 作者:rpophessagr

我正在升级一个插件,但dbdelta有问题。

以下是原始db创建函数:

global $jal_db_version;
$jal_db_version = "0.1";

function jal_install() {

   global $jal_db_version;

   global $wpdb;
   $table_name = $wpdb->prefix . "jalPlugin";      
   $sql = "CREATE TABLE " . $table_name . " (
      id mediumint(9) NOT NULL AUTO_INCREMENT,
      timestamp datetime DEFAULT \'0000-00-00 00:00:00\' NOT NULL,
      hash text NOT NULL,
      uname tinytext NOT NULL,
      UNIQUE KEY id (id)
    );";

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

   update_option("jal_db_version", $jal_db_version);
}

// Installs db on plugin activation
register_activation_hook(__FILE__,\'jal_install\');
你可能会从WordPress Codex on Using Tables -- 它工作得很好。(我显然修改了函数名,以免与其他插件冲突)。

我正在尝试升级用于插件的db,但遇到了一些问题。我认为dbdelta应该能够看到您所拥有的和您想要的之间的差异,并相应地修改一个表。下面是我的升级脚本:

global $jal_db_version;
$jal_db_version = "0.2";
function jal_install() {

   global $wpdb;
   $table_name = $wpdb->prefix . "jalPlugin";      
   $sql = "CREATE TABLE " . $table_name . " (
        id mediumint(9) NOT NULL AUTO_INCREMENT,
        timestamp datetime DEFAULT \'0000-00-00 00:00:00\' NOT NULL,
        hash text NOT NULL,
        uIP VARCHAR(55) DEFAULT \'\' NOT NULL,
        uname tinytext NOT NULL,
        UNIQUE KEY id (id)
    );";

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

   update_option("jal_db_version", $jal_db_version);

}

function jal_install_update_check() { 
    global $jal_db_version;
    if (get_site_option(\'jal_db_version\') != $jal_db_version) {
        jal_install();
    }
}
add_action(\'plugins_loaded\', \'jal_install_update_check\');
我从同一个法典页上得到了这个代码。

数据库未更新,错误日志中出现错误:

[05-Feb-2012 20:33:18] WordPress database error Table \'wp_2_jalPlugin\' already exists for query CREATE TABLE wp_2_jalPlugin (
        id mediumint(9) NOT NULL AUTO_INCREMENT,
        timestamp datetime DEFAULT \'0000-00-00 00:00:00\' NOT NULL,
        hash text NOT NULL,
        uIP VARCHAR(55) DEFAULT \'\' NOT NULL,
        uname tinytext NOT NULL,
        UNIQUE KEY id (id)
    ) made by require, require_once, require_once, require_once, do_action, call_user_func_array, qrLogin_update_db_check, qrLoginDB_install, dbDelta
在我看来,dbdelta似乎不理解它有工作要做。。。

有什么想法吗?

。。。谢谢你的时间!

1 个回复
最合适的回答,由SO网友:mor7ifer 整理而成

我对dbdelta从来没有什么好运气,它最多只能运行得很不稳定,当我编写代码时,这还不够好。我处理数据库更改的方法是使用数据库版本。因此,当我创建插件时,我也会设置数据库版本,然后如果我想更新数据库,我会检查当前的dbversion(几乎总是存储在wp\\U选项表中),如果它小于新的DB版本,我会运行一系列更新。如果发布另一个需要更改数据库结构的更新,我将重复此过程。这允许用户更新插件,即使是从一个非常旧的版本,仍然可以确保数据库格式是正确的。如果数据需要转换并重新输入到数据库中,此方法也可以使用,因为它将在每次结构更改中更新,就像插件正在增量更新一样。

结束

相关推荐

Plugin Upgrade Strategy

阅读register_activation_hook() 告诉我,在wordpress 3.1中,这只适用于每个插件激活,而不适用于插件升级。我想知道的是,什么是最好的插件升级策略?我的想法是:如果{plugin\\u name}\\u version(插件名称)},让我们假设它来自上一个版本(因为在该版本中,我们还没有{plugin\\u name}\\u version”选项。转到进程2。如果{plugin\\u name}\\u version”选项存在并且与脚本中设置的{plugin\\u nam