【问题标题】:Database column names in VaporVapor 中的数据库列名
【发布时间】:2017-06-12 13:15:13
【问题描述】:

我正在熟悉 Vapor 2.0 服务器端 Swift 框架,而让我感到困惑的是字符串文字的广泛使用。例如,实现Model 协议,您必须像这样解析和序列化行(取自自动生成的示例项目):

// Initializes the Post from the database row
init(row: Row) throws {
    content = try row.get("content")
}

// Serializes the Post to the database
func makeRow() throws -> Row {
    var row = Row()
    try row.set("content", content)
    return row
}

如您所见,对于每个属性,您使用它的数据库名称两次作为字符串文字,仅用于此特定协议。在其他情况下还有更多——比如Database 协议、您自己的方法等。

这里使用文字字符串作为参数有静态分析器不检查它们的明显缺点(就像Objective-C中的键值参数一样),使得这种方法非常容易出错。有没有我遗漏的最佳实践?

【问题讨论】:

    标签: swift swift3 vapor


    【解决方案1】:

    您可以通过将字符串作为静态属性存储在模型上并引用它来轻松地最小化重复字符串的次数。

    final class Post: Model {
        // Keys
        static let contentKey = "content"
    
        // Properties
        var content: String
    
        // Initializes the Post from the database row
        init(row: Row) throws {
            content = try row.get(Post.contentKey)
        }
    
        // Serializes the Post to the database
        func makeRow() throws -> Row {
            var row = Row()
            try row.set(Post.contentKey, content)
            return row
        }
    
        ...
    }
    
    extension Post: Preparation {
        static func prepare(_ database: Database) throws {
            try database.create(self) { builder in
                builder.id()
                builder.string(Post.contentKey)
            }
        }
    
        ...
    }
    

    不幸的是,这可能是您可以有意义地做的所有事情,以使事情更加类型安全。目前无法向编译器提供有关数据库实际结构(或任何其他字符串,如 JSON)的信息。不过,如果我们能做到这一点,那就太棒了!也许有一天。

    (我会考虑更新 API 和 Web 模板以包含此内容,在此处跟踪问题:https://github.com/vapor/api-template/issues/35

    【讨论】:

    【解决方案2】:

    不!你做对了。由于 Swift 中缺乏高级运行时库,我们几乎无能为力。

    但是,在 Swift 4 中,您可以将键路径用于相同目的。

    \Post.content 将为内容变量创建一个静态检查的键路径。

    关于关键路径的 WWDC 会议绝对值得一看。

    【讨论】:

    • 感谢您的建议,一定会观看会议的!
    猜你喜欢
    • 2021-03-30
    • 2021-12-06
    • 2019-05-21
    • 2019-07-24
    • 2019-04-22
    • 1970-01-01
    • 2021-12-14
    • 2022-08-11
    • 2023-03-26
    相关资源
    最近更新 更多