【问题标题】:Update all PostgreSQL databases without losing data更新所有 PostgreSQL 数据库而不丢失数据
【发布时间】:2020-10-01 19:23:00
【问题描述】:

我是一名新手 Web 应用程序开发人员,我正在通过开发一个 Web 应用程序来学习,每个成功注册的用户都将登录到他的数据库。所有用户都有相同的数据库架构,有时我需要更新架构,因为我添加了一项功能。

我试图在 Visual Studio 的包管理器控制台中的一个命令中使用新架构更新所有数据库 (PostgreSQL)。

我通常的做法是使用以下命令创建迁移(我的新架构):

add-migration -context MyContextRecords 初始

然后我执行的下一个命令是:

更新数据库-context MyContextRecords

第二个命令一次使用我在课堂上指定的一个数据库,我必须在键入此命令之前删除并删除数据库,这样做意味着用户存储的所有数据都将丢失。更不用说我是否有 100 个用户....为每个注册用户一次执行一个命令根本不方便...所以我相信一定有更好的方法?!?!?

那么,包管理器控制台中是否有更好的方法能够更新所有用户的所有数据库架构,而无需删除/删除 (pgAdmin) 和丢失数据。

谢谢:)

【问题讨论】:

  • 为什么要为每个用户使用单独的数据库?
  • 但是.. 数据库迁移可以在代码中触发;所有这些控制台命令正在为您添加代码文件并为数据库创建快照。您可以选择应用迁移的时间和数据库,尽管如果您有一百个数据库和一百个连接字符串并因此需要循环通过一百个上下文,这有点尴尬。就像 Garr 所说,为每个人都拥有一个数据库不是更容易吗?如果您的用户要求数据分离和他们自己的服务,那没关系;您将拥有一百台服务器和一百个配置文件,每个配置文件都有一个配置文件。部署到所有服务器,迁移工作
  • 我从你的 Q 中得到的印象是你有一台 100 db 的服务器——这更令人讨厌
  • 是的,我有一台服务器,其中可以有尽可能多的数据库,就像我说的那样,我只是在了解更多信息并进行试验。我正在考虑从现在开始保留迁移,而不是创建一个新的迁移,我只需通过添加我想要的新列来修改它。并编写某种脚本来更新此修改后的迁移存在的所有数据库。这可能吗?

标签: c# database postgresql entity-framework-core


【解决方案1】:

您可能想阅读Database versioning

简而言之,数据库应该知道它所在的版本。然后您可以运行一系列 sql 脚本来将数据库从该版本更新到最新版本。如果可能,这应该保留现有数据,但它可能需要处理丢失的数据或数据结构的更改。

还有一些数据库工具可以采用两种数据库模式并为它们创建更新脚本。但如果有较大的变化,这可能容易出错。

在任何一种情况下,您都可能希望编写更新脚本。 IE。使站点脱机,进行备份,运行脚本,更新网站并使所有内容再次联机。确保在使用数据库备份副本的测试系统上测试您的更新脚本,然后再进行实际操作。由于它是脚本化的,因此至少有一个或数百个数据库都无关紧要。

这是一个有点复杂的问题,所以我不希望有任何简单的一键式解决方案。

【讨论】:

    【解决方案2】:

    我想通了。只要您保留初始迁移文件并且从不删除它们,您就可以在不删除或删除 PG-ADMIN 的情况下更新您的数据库。我删除它们并创建新迁移是一个错误。正确的做法是保留包含 ContextModelSnapshot.cs 的第一个迁移文件。从那里您只需要创建一个新的迁移。现在可以进行更新,而且您不会丢失任何数据。

    关于一次更新所有数据库的讨论在此链接中: How to use the optionsBuilder.UseNpgsql with multiple connection strings?

    【讨论】:

      猜你喜欢
      • 2011-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-05
      • 2016-02-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多