【问题标题】:Avoiding Vapor migrations on a new database避免在新数据库上进行 Vapor 迁移
【发布时间】:2020-01-15 10:25:15
【问题描述】:

我已经创建了向 Postgres 表添加字段的迁移,它在现有数据库上按预期工作。但是,当我想使用新数据库运行相同的蒸汽服务器时,它会在迁移时崩溃,并显示“字段已存在”消息,这当然是可以理解的。但是如何维护服务器代码以便它可以与现有数据库和新数据库一起使用?

Fatal error: Error raised at top level: PostgreSQL Error: column "the_coloumn" of relation "User" already exists
- id: PostgreSQLError.server.error.check_for_column_name_collision
: file /BuildRoot/Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-1100.8.280/swift/stdlib/public/core/ErrorType.swift, line 200

【问题讨论】:

    标签: swift vapor vapor-fluent


    【解决方案1】:

    假设您已部署应用程序并进行了多次安装,那么您将需要保留表的两个版本。如果你还没有,那么你总是可以删除第二个迁移,如果它只是添加字段。正如您所发现的,该字段是在新安装的第一次迁移中创建的。

    但是,如果您必须同时拥有这两者,那么您将需要在原始迁移中使用AddProperties 替换您在使用显式字段列表构建表的原始迁移中的使用,减去您在第二次迁移中添加的那个。单个字段创建的示例如下:

    extension User:Migration
    {
        static func prepare(on connection:MySQLConnection) -> Future<Void>
        {
            return Database.create(self, on:connection)
            {
                builder in
                builder.field(for:\.id, isIdentifier:true)
                builder.field(for:\.surname, type:.varchar(30, characterSet:nil, collate:nil))
                builder.field(for:\.firstName, type:.varchar(30, characterSet:nil, collate:nil))
            }
        }
    }
    

    这将像您之前在原始数据库中创建表时那样构建表。然后您的第二次迁移将像以前一样工作。请参阅https://docs.vapor.codes/3.0/fluent/migrations/ 了解更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-10
      • 2019-12-02
      • 2016-02-28
      • 1970-01-01
      • 2017-08-08
      • 2015-08-17
      • 1970-01-01
      相关资源
      最近更新 更多