Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 生产数据库中的架构迁移?_Python_Database_Web_Database Migration_Web Frameworks - Fatal编程技术网

Python 生产数据库中的架构迁移?

Python 生产数据库中的架构迁移?,python,database,web,database-migration,web-frameworks,Python,Database,Web,Database Migration,Web Frameworks,我已经开始学习web开发(具体来说是Flask和Django),在我所看到的任何地方,数据库的主题总是从迁移开始 根据我对更新数据库的理解,应该 运行“生成迁移脚本的内容”以生成迁移脚本,该脚本将区分当前模型文件和当前数据库 在本地数据库上测试迁移脚本 提交迁移脚本,使其到达生产环境,然后再次运行脚本以更新生产数据库 但是在阅读维基百科上的Schema Migrations时,我发现了以下内容: 模式迁移通常仅在数据保存在 数据库不是真实的,也不是有价值的,比如在软件开发中, 开发人员只处理(可

我已经开始学习web开发(具体来说是Flask和Django),在我所看到的任何地方,数据库的主题总是从迁移开始

根据我对更新数据库的理解,应该

  • 运行“生成迁移脚本的内容”以生成迁移脚本,该脚本将区分当前模型文件和当前数据库
  • 在本地数据库上测试迁移脚本
  • 提交迁移脚本,使其到达生产环境,然后再次运行脚本以更新生产数据库
  • 但是在阅读维基百科上的
    Schema Migrations
    时,我发现了以下内容:

    模式迁移通常仅在数据保存在 数据库不是真实的,也不是有价值的,比如在软件开发中, 开发人员只处理(可能生成的)测试 数据。[需要引证]编程模式迁移几乎从未出现过 出于同样的原因在生产中执行


    它说人们应该避免在生产过程中迁移,那么你应该如何更新你的数据库呢?

    我不知道维基百科文章的作者是从哪里得到这个想法的;根据历史,它已经在第一次修订中,对我来说,这种武断的限制是没有意义的

    与程序版本一起迁移数据库通常是必要的,这意味着它对于生产数据库是必要的。我在这里不区分行中的数据和模式,因为这有点随意。从代码的角度来看,数据库是对数据进行编码的一种方式,编码方案直接影响模式和行中数据的编码

    也许有必要讨论这种迁移的风险(生产数据库有时会包含意外情况,如损坏的数据、通过手动运行SQL查询修改的数据)或复杂性(如添加和删除外键)。但我见过许多产品在发布新版本时迁移数据和模式


    更新:我已经更新了Wikipedia页面,让我们看看编辑会持续多久:-)

    我相信作者的意思是,自动化的模式迁移应该只在开发阶段,在开发或测试环境中进行,因为在大型生产数据库上,架构迁移期间可能会出现一些可用性或性能问题


    例如,在5.6之前的MySQL中,没有本机联机模式更改,因此在运行
    ALTER table
    时,必须有一个表锁。如果是一个小表,或者是一个包含生成数据的测试环境,这通常不是问题——一个小表很快就会完成,您可以丢弃一个测试表并重新生成数据——但是生产环境中的一个大表可能会被锁定数小时,甚至数天或数周,使系统不可用于涉及该表的任何交互。您必须采用替代的迁移方法来以最少的停机时间执行更改,而且这些方法不简单,也不安全,无法自动执行。

    是的,这是荒谬的。架构迁移一直都是到生产数据库的。由于需要更改,通常还需要更改底层数据库。Django和Flask都有执行数据库更新的路径,Django在当前版本中是内置的
    mirregate
    命令,在以前的版本中是内置的
    South
    。Flask/SQLAlchemy有
    alembic
    用于处理模式更改。尽管如此,这仍然可能是一种痛苦,也可能是危险的,所以测试并制定一个回滚计划

    是否通过生产中的迁移应用自动模式更改,基本上取决于组织的策略。具有较低价值数据和/或较小数据库的较新组织倾向于使用这些数据,直到遇到迁移需要一天或更长时间甚至可能崩溃的情况。如果重要数据丢失,数据库更改策略通常会变得更加保守,不太可能由编写应用程序的开发人员驱动,而更多的是由DBA或DevOps人员在层层审查后驱动。因此,依我看,这些陈述是组织经验和成熟度的反映,而不是绝对的。换言之,直到它不起作用为止,然后再执行其他流程。

    很明显,作者所指的只是由提交或部署触发的自动模式更改。最好是编辑维基百科文章,使其明确,而不是删除评论。这不是一个任意的限制。编程数据库迁移一直在进行,即通过
    south
    alembic
    django migrate
    等工具。应该是这样的,与手工编码的SQL命令相比,发生错误的可能性要小得多。@我们可以尝试使用自动化工具(如south或alembic)在一个有数十亿行的表上,在一个本机不支持在线模式更改的生产数据库上进行模式迁移,没有明显的停机时间。这不是问题所在。“出于同样的原因,编程模式迁移几乎从未在生产环境中执行过。”这是错误的。至于您的观点,您仍然可以使用south/alembic,因为您知道不可能对具有1B行的表执行实时更新,所以开发人员只需考虑这一点