【问题标题】:How to approach updating an database-driven application after release?发布后如何更新数据库驱动的应用程序?
【发布时间】:2013-01-16 17:29:18
【问题描述】:

我正在开发一个非常依赖数据库驱动的网络应用程序。我即将发布初始版本,因此我已锁定此版本的功能,但在发布后将实施许多其他功能。这些功能不可避免地需要对数据库模型进行一些修改,因此我担心在每个版本中迁移数据库的复杂性。我想知道的是,我应该在多大程度上关注现在锁定可靠的数据库设计以便我可以快速发布,而不是现在尝试预测某些功能以便我可以在发布之前将其构建到数据库中?我也预计会发现我当前模型的缺陷,然后可能想要对其进行更改,但如果我发布应用程序然后数据开始进入,我想迁移数据将是一项艰巨的任务。是否有解决此类问题的常规方法?指向正确方向的点会非常有用。

作为背景知识,我正在为 CG 制作流程开发一个资产管理系统。如此多的数据,它们之间有很多联系。它是基于网络的,完全用 Python 编写,它使用带有 SQLite 引擎的 SQLAlchemy。

【问题讨论】:

    标签: python database migration sqlalchemy


    【解决方案1】:

    为生产应用程序管理数据库的一些想法:

    1. 每晚进行备份。这一点至关重要,因为如果您尝试更新(对数据或架构)并且搞砸了,您需要能够恢复到更稳定的状态。

    2. 创建环境。您应该拥有一个用于开发的本地数据库副本、一个供其他人在上线前查看和测试的暂存数据库,当然还有一个您的实时系统指向的生产数据库。

    3. 在开始本地开发之前,请确保所有三个环境都同步。这样您就可以跟踪一段时间内的变化。

    4. 开始编写脚本并对其进行版本控制。确保将它们存储在源代码控制系统(SVN、Git 等)中。您只需要更改历史记录以及需要在给定版本中运行的一小部分脚本。只是帮助您保持井井有条。

    5. 对本地数据库进行更改并进行测试。确保您有执行两件事的脚本,1) 修改数据或架构的脚本,2) 用于撤消您所做的工作的脚本,以防出现问题。在本地反复测试这些。运行脚本,测试然后回滚。还好吗?

    6. 在暂存时运行脚本,看看是否一切正常。再次证明您的工作是好的,如果需要,您可以撤消更改。

    7. 一旦准备好并且您有信心,就可以在生产数据库上运行您的脚本。请记住,您有更改数据的脚本(更新、删除语句)和更改架构的脚本(添加字段、重命名字段、添加表)。

    一般来说,慢慢来,并在你的行动中非常慎重。你越自律,你就会越自信。更新数据库可能很可怕,所以不要着急,写下你的行动计划,然后测试、测试、测试!

    【讨论】:

      【解决方案2】:

      我看到(并且喜欢)的一种方法是一个名为 versions 的表,它只包含一个 id。

      然后有一个updates.sql 脚本,其结构类似于:

      DELIMITER $$
      
      CREATE PROCEDURE IF NOT EXISTS DBUpdate()
      BEGIN
      
      IF (SELECT id FROM versions) = 1 THEN
        CREATE TABLE IF NOT EXISTS new_feature_table(
           id INT PRIMARY KEY AUTO-INCREMENT,
           blah VARCHAR(128) ...,
        );
      
      IF (SELECT id FROM versions) = 2 THEN
        CREATE TABLE IF NOT EXISTS newer_feature_table(
           id INT PRIMARY KEY AUTO-INCREMENT,
           blah VARCHAR(128) ...,
        );
      
      END$$
      
      DELIMITER ;
      
      CALL PROCEDURE DBUpdate();
      

      然后您编写一个 python 脚本来检查存储库的更新,连接到数据库,并通过此过程运行对架构的任何更改。这很好,因为您只需要一个具有适当 id 值的 versions 表来构建整个数据库(即没有数据;请参阅 ryan1234 关于数据备份的答案)。

      【讨论】:

        猜你喜欢
        • 2018-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-25
        • 1970-01-01
        • 1970-01-01
        • 2018-01-28
        相关资源
        最近更新 更多