Python 在没有DBA的情况下,有哪些策略可以维护一个由开发人员组成的公共数据库模式?

Python 在没有DBA的情况下,有哪些策略可以维护一个由开发人员组成的公共数据库模式?,python,database,postgresql,sqlalchemy,database-schema,Python,Database,Postgresql,Sqlalchemy,Database Schema,我很好奇其他人是如何处理在没有DBA的情况下跨许多(10+以上)开发人员维护和同步数据库更改的问题的?基本上,我的意思是,如果有人想对数据库进行更改,有哪些策略可以做到这一点?(即,我已经创建了一个“汽车”模型,现在我想对数据库应用适当的DDL,等等) 我们主要是一家Python商店,我们的ORM是SQLAlchemy。以前,我们编写模型的方式是使用ORM创建模型,但最近我们放弃了这种方式,因为: 我们无法使用ORM跟踪更改 ORM的状态与数据库不同步(例如,许多差异主要与索引和唯一约束有关)

我很好奇其他人是如何处理在没有DBA的情况下跨许多(10+以上)开发人员维护和同步数据库更改的问题的?基本上,我的意思是,如果有人想对数据库进行更改,有哪些策略可以做到这一点?(即,我已经创建了一个“汽车”模型,现在我想对数据库应用适当的DDL,等等)

我们主要是一家Python商店,我们的ORM是SQLAlchemy。以前,我们编写模型的方式是使用ORM创建模型,但最近我们放弃了这种方式,因为:

  • 我们无法使用ORM跟踪更改
  • ORM的状态与数据库不同步(例如,许多差异主要与索引和唯一约束有关)
  • 除非开发人员通过电子邮件向团队记录数据库更改,否则无法审核数据库更改
我们对这个问题的解决方案基本上是让一个“看门人”来检查数据库中的每个更改,并将所有接受的数据库更改应用到
接受的db\u changes.sql
文件中,从而需要进行任何数据库更改的开发人员将其请求放入
建议的db\u changes.sql
文件中。我们签入这个文件,当它更新时,我们都会将更改应用到开发机器上的个人数据库中。我们不在模型上创建索引或约束,它们显式地应用于数据库

我想知道维护数据库模式的一些策略是什么,以及我们的策略是否合理

谢谢

你试过这些工具吗


它们是专门为自动迁移数据库设计更改而设计的。

解决方案是管理性的,而不是技术性的:)

一般规则很简单,项目中应该只有树状依赖项: -架构应该始终有一个主源,与项目源代码一起存储在版本控制中 -受主源代码更改影响的所有内容应在每次更新主源代码时自动重新生成,不允许手动干预。如果自动生成不起作用,请修复主源代码或生成器,不要手动更新源代码 -所有重新生成应由更新主源的同一人执行,包括主源更改在内的所有更改都应视为单个事务(单个源代码控制提交、每个受影响环境的单个构建/部署,包括DBs更新)

实施后,结果100%可靠

主要有3种可能的主源选择 1) 数据库元数据,源是在数据库更新后由连接到实时数据库的工具生成的 2) 源代码,一些工具正在从源代码生成SQL方案,以特殊的方式进行注释,然后在DB上运行SQL 3) SQL模式和源代码都是通过某种工具生成的 4) 还使用了其他一些描述(例如,由生成SQL模式和源代码的特殊Perl脚本读取的文本文件)

1,2,3同样好,前提是您需要的工具存在并且不太昂贵
4是一种通用的方法,但它应该从项目的一开始就应用,并且用一种奇怪的语言维护几千行代码的开销,所以我假设您直接在物理db上设计db是正确的吗?我在很多年前就这样做了,但是结果数据库的质量非常差。如果您使用建模工具(我个人认为Sybase pdesigner仍然是同类中的佼佼者,但请四处看看),每个人都可以对模型进行更改,只需根据需要同步本地数据库(它还将接收文档任务)。因此,在re bobah的帖子中,主要是pdesigner模型,而不是物理数据库

您的
是否接受\u db\u变更。sql
文件是否包含一个庞大的变更脚本列表?我不确定我是否喜欢更改文件名的想法,等等。考虑到两个db版本之间的差异是alter脚本的顺序列表,那么像这样的模型如何:

Ver1 (folder)
  Change 1-1.sql
  Change 1-2.sql
  Change 1-3.sql
Ver2 (folder)
  Change 2-1.sql
  Change 2-2.sql
  Change 2-3.sql
在提交之前审查每个更改(新文件)

一般规则应该是有意识地尽可能多地自动化开发环境中的数据库部署;我们在这项工作上取得了可观的投资回报。您可以使用诸如redgate之类的工具来生成ddl(它有一个api,但不确定它是否与SQLAlchemy一起工作)。在我看来,数据库更改应该是微不足道的,如果您发现它们被阻塞了,那么看看您可以自动执行哪些操作。

您可能会发现这本书很有帮助,因为它包含了管理数据库的一般策略,而不仅仅是如何折射它们


他的系统期望每个开发人员都有自己的数据库副本,以及在部署到生产环境之前使用的一些通用测试数据库。您的情况是本书中描述的比较简单的情况之一,因为您没有许多单独的应用程序使用数据库(尽管您确实需要知道如何描述数据库迁移的人)。最大的问题是能够从源代码管理中的信息构建数据库,并通过小迁移(请参阅@WoLpH的答案)来描述更改,而不仅仅是在数据库中进行更改。此外,如果您至少有ORM数据库测试来检查它们是否仍然同步,您会发现事情会变得更容易。

您的守门人实际上是您的DBA。除了更多的文档和更多的模式检查之外,您可以做的事情很少。数据的结构至少应该像代码单元的QA一样受到重视。我可能会做一个大的图表,然后贴在墙上。有趣的书,我会看看。谢谢你的推荐!这可能是最合理的方法,尤其是在一开始