代码之家  ›  专栏  ›  技术社区  ›  ringmaster

如何在部署期间保持数据同步?

  •  6
  • ringmaster  · 技术社区  · 17 年前

    我有机会使用开发、登台和生产环境制作Drupal网站。使用subversion保持站点之间的代码同步是一项简单的任务。不那么简单的是在安装之间传播对数据库数据(不仅仅是模式)的更改。

    我要寻找的是一种同步这些数据库更改的方法,这样,如果一个开发人员在登台服务器上进行CCK字段更改,它们可以向下传播到本地开发环境以进行更多工作,最终传播到生产环境。

    有没有工具可以做到这一点?您在这样一个项目中处理单个或多个开发人员的过程是什么?

    4 回复  |  直到 8 年前
        1
  •  5
  •   Oli    17 年前

    对于基本数据同步:我使用mysqldump每晚将所有数据转储到一个.sql文件中。然后脚本将其签入版本控制系统。这是一个简单的bash脚本,但您可以在几乎任何平台上执行类似的操作。。。

    我刚刚读了进一步的内容,我不确定我的方法是否有用。我从来没有合并过SQL转储,因此无法评论它的管理效率。

    虽然您应该能够将更改(模式、新数据)推送到登台/生产服务器,但将更改拉回到开发中可能会有更多的麻烦。正如我所说的,合并可能是可能的,也可能是不可能的。我只是不知道。

        2
  •  2
  •   Sean McSomething    17 年前

    在这里,我们已经将CCK降级为原型和v.simple节点类型。尝试将数据库中的“配置”与“内容”分开是不值得的。有各种各样的方法可以让事情保持同步,但简而言之,除非它在一个文件中,或者给你一个导出到一个文件的选项,否则你会受到伤害。(额外的好处是,将视图导出到文件比每次使用它时将其从数据库中拉出要快一些。)

        3
  •  1
  •   Stewart Robinson    17 年前

    我试图在另一个问题中回答我是如何做到这一点的。我也会把它贴在这里

    我认为这里的一个好策略是使用InstallProfileAPI。使用InstallProfileAPI,您可以完成使用Drupal管理工具所做的大多数事情。大多数核心表单只是在变量表中设置变量。为了能够合理地对非内容数据库内容(即配置)进行版本设置,明智的做法是使用更新功能。

    在我的网站上,我们有一个模块“ec”,除了它的ec.install文件包含更新功能外,几乎没有其他功能,例如ec_update_6001()

    您的主安装功能可以负责在任何新安装上实际运行更新,以使模块更新。

    function ec_install() {
      $ret = array();
      $num = 0;
      while (1) {
       $version = 6000 + $num;
       $funcname = 'ec_update_' . $version;
       if (function_exists($funcname)) {
         $ret[] = $funcname();
         $num++;
       } else {
         break;
       }
      }
    return $ret;
    }
    

    // Create editor role and set permissions for comment module
    function ec_update_6000() {
      install_include(array('user'));
      $editor_rid = install_add_role('editor');
      install_add_permissions(DRUPAL_ANONYMOUS_RID, array('access comments'));
      install_add_permissions(DRUPAL_AUTHENTICATED_RID, array('access comments', 'post comments', 'post comments without approval'));
      install_add_permissions($editor_rid, array('administer comments', 'administer nodes'));
      return array();
    }
    // Enable the pirc theme.
    function ec_update_6001() {
      install_include(array('system'));
      // TODO: line below is not working due to a bug in Install Profile API. See http://drupal.org/node/316789.
      install_enable_theme('pirc');
      return array();
    }
    
    // Add the content types for article and mtblog
    function ec_update_6002() {
      install_include(array('node'));
      $props = array(
        'description' => 'Historical Movable Type blog entries',
      );
      install_create_content_type('mtblog', 'MT Blog entry', $props);
      $props = array(
        'description' => 'Article',
      );
    install_create_content_type('article', 'Article', $props);
    return array();
    }
    

    有效地解决了数据库和Drupal代码的版本控制问题。我们广泛使用它。它允许我们推广新的代码,这些代码可以更改数据库配置,而无需重新导入数据库或进行实时更改。这也意味着我们可以正确地测试发布,而不用担心隐藏的数据库更改。

    最后,cck和视图支持这种方法。请参阅此代码段

    // Enable CCK modules, add CCK types for Articles in prep for first stage of migration,
    // enable body for article, enable migration modules.
    function ec_update_6023() {
      $ret = array();
      drupal_install_modules(array('content', 'content_copy', 'text', 'number', 'optionwidgets'));
      install_include(array('content', 'content_copy'));
      install_content_copy_import_from_file(drupal_get_path('module', 'ec') . '/' . 'article.type', 'article');
      $sql = "UPDATE {node_type} SET body_label='Body', has_body=1
      WHERE type = 'article'";
      $ret[] = update_sql($sql);
      return $ret;
    } 
    
        4
  •  0
  •   Ramesh Soni    17 年前

    推荐文章