Codeigniter可升级的数据库进程模块逻辑

时间:2011-09-10 18:36:34

标签: mysql database codeigniter module upgrade

我正在尝试使用Codeigniter构建自己的cms。 我已经写了一些模块。但是,我及时对他们做了一些改变。 现在,如果我想升级一个模块。我用ftp发送文件并用phpmyadmin更改数据库字段。

错误的东西需要花费很多时间和很高的可能性,而且对于我使用这个模块的每个项目,我都必须重复这些更改。

现在,我打算制作一个安装系统。

我的模块目录结构如下:

/modules
/modules/survey/
/modules/survey/config
/modules/survey/config/autoload.php
/modules/survey/config/config.php
/modules/survey/config/routes.php
/modules/survey/config/install.php
/modules/survey/controllers
/modules/survey/controllers/entry.php...
/modules/survey/models
/modules/survey/models/survey.php...
/modules/survey/views
/modules/survey/views/index.php...

我认为所有模块都应该在config目录中有一个install.php文件。这是保持相关模块的设置。如下所示:

$config['version']  = 1.1;  //or 1.2, 1.3 etc.
$config['module'] = 'Survey Module';
$config['module_slug'] = 'survey';
$config['module_db_table'] = 'module_survey'; 

我已经安装了instal_modules表:

id, module, module_slug, version

现在,我正在尝试制作安装脚本。如下所示:

开始之前,我压缩模块的文件。

1- upload zip file with an installation page to a temp directory 
2- unzip the module in this temp direcorty
3- Find install.php
4- Get modules information from install.php
5- Check if this module already in installed_modules table.
6a) If it's not: I will make a new module_survey table. And copy this temp directory into the real modules directory.
6b) If it's already : I have to change the structure of this table without lossing the data added before. Delete all module files and copy the new ones from temp into the modules directory.
7- When everything done, Delete temp directory.

我陷入了6a和6b。

对于6a,我应该如何创建e.x'modules_survey'表。 我应该在install.php中添加$ config ['db_query'],如

$config['db_query'] = "CREATE TABLE IF NOT EXISTS `module_survey` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
`lang_id` int(11) NOT NULL DEFAULT '1',
`usort` int(3) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 ;
";

并运行此查询。或者你的建议是什么?可能不只有一个表,对于不同的模块,应该有2个或更多的关系。

和6b:

我想,我应该创建一个名为“temp_module_survey”的新临时表。

旧字段=
    $ oldFields = $ this-> db-> field_data('module_survey');

表示新字段=     $ newFields = $ this-> db-> field_data('temp_module_survey');

比较新添加的字段,删除的字段以及fieldData已更改的字段。 和 将新字段添加到oldTable 从oldTable中删除不必要的字段 并更新fieldData已更改的字段。

然后删除临时表。

总结一下,如何在不丢失旧数据的情况下更改数据库。

我希望我能解释一下。

谢谢。

1 个答案:

答案 0 :(得分:0)

Phil Sturgeon的codeigniter-migrations可以提供帮助。