我正在尝试开发一个像大多数应用程序一样使用数据库的Web应用程序。为了创建数据库,我编写了一个.sql
文件,其中包含我对数据库所做的所有更改。我不知道究竟为什么,但在过去我总是发现很难清空我的数据库或稍后在我发现更改有意义时修改它。由于我仍在学习所有这些与数据库相关的东西,我的数据库的第一个布局将始终被更改。为了跟踪所有这些变化,我养成了创建这个.sql
文件的习惯。
在这个文件中,我总是删除所有已经存在的表并创建所有新表。我这样做是为了随时掌握我的数据库的实际状态。与直接使用命令行数据库工具相比,对文件的更改更容易。第一个问题确实是:这实际上是一种好的做法,还是有其他方式来组织我尚未听到的事情?
真正的问题是:我在哪里存储这个文件?将它存储在与实际代码相同的git-repository中是一种好习惯吗?我应该把它放在git中吗?我也认为git / github是一个云存储,如果我的硬盘烧毁,我的所有项目都会在那里,因为我把它们放在github上。如果我没有.sql文件,我将不得不从new设置数据库。
答案 0 :(得分:2)
此类代码的一般类别是“数据库迁移”。有专门用于这些任务的工具,各种Web应用程序框架可能支持各种不同的数据库迁移工具,或者它们可能有自己的功能。
这个类别中最受欢迎的Python工具/套件(SQLAlchemy中实现的模型)可能是Alembic。其他一些选项包括Flyway,Liquibase和Sqitch。
在所有这些情况下,您管理数据库模式的抽象(SQL,XML,YAML),这些工具生成必要的SQL和其他代码,以便在整个历史记录中从每个模式版本执行“迁移”到下一个模式你的项目。通常这些是以增量生成的。它们以初始数据库模式(可能完全为空)开始,构建并将模式初始化为该版本;然后构建并迁移每个步骤以获得所需的版本。
如果您对架构进行更彻底的更改,这可能会变得任意复杂。在没有“NOT NULL”约束的情况下向表中添加额外的列是微不足道的。例如,通过“NOT NULL”联结表添加新的M:N关系并从某些非规范化模式迁移到更高的正常形式可能需要中间阶段,您可能需要删除某些约束并容忍通过某种过渡状态违反参照完整性。
我强烈建议您阅读这些网站,他们的教程,HOWTO和其他文档,以深入了解这些工具存在的原因以及他们如何处理这个问题空间。
答案 1 :(得分:0)
Yu正在重新发明轮子,我的朋友,你的解决方案正在对DB Schema进行版本控制。是的,应该将更改添加到项目文件中,就像几乎所有框架一样。我建议您阅读以下问题 How do you version your database schema?
答案 2 :(得分:0)
是的,您绝对应该将此代码保留在源代码管理中。但是,存储库中代码的确切位置取决于您和/或您的开发团队或管理层。一些好的选择是安装,设置,SQL或ddl文件夹。
答案 3 :(得分:0)
是的,你在做什么是正确的。
与rails上的ruby比较:文件db/schema.rb
包含整个架构。这样一个完整的文件也很好。例如,这允许您轻松地引导新环境(例如,新的测试环境)。这个文件显然从未在生产中使用,因为它会消灭所有数据。
然后有单独的小文件db/migrations/20171003_add_name_to_person_table.rb
或者对模式进行增量更改的任何内容 - 称为迁移。这些用于更改现有环境而不会丢失数据,并使用某种机制确保每个数据库仅为每个数据库运行一次。
在你的舞台上,完全可以手动完成所有这些操作。您可以稍后根据需要尝试自动执行此操作。你注意到这里发生的事情已经足够了。
那些东西必须进入你的代码库,无论哪里看起来很自然。 /db
,/schema
,/etc
可能是一些选择。