Vapor fluent 不会在违反外键约束时抛出

Posted

技术标签:

【中文标题】Vapor fluent 不会在违反外键约束时抛出【英文标题】:Vapor fluent doesn't throw upon violating foreign key constraint 【发布时间】:2020-02-25 06:48:01 【问题描述】:

当我使用 create 向数据库添加模型时,当违反其中一个外键时,Vapor fluent 不会引发异常。它也没有插入,create函数只是正常返回。

这是 Vapor Fluent 的标准行为吗?

我正在使用带有 PostgreSQL 的 Vapor 3。

这是我添加外键约束的迁移:

struct AddAddressForeignKeys: Migration 
    typealias Database = PostgreSQLDatabase

    static func prepare(on conn: PostgreSQLConnection) -> Future<Void> 
        return PostgreSQLDatabase.update(Address.self, on: conn)  builder in
            builder.reference(from: \.regionId, to: \CodeRegion.id)
            builder.reference(from: \.countryId, to: \CodeCountry.id)
        
    

    static func revert(on conn: PostgreSQLConnection) -> Future<Void> 
        return PostgreSQLDatabase.update(Address.self, on: conn)  builder in
            builder.deleteReference(from: \.regionId, to: \CodeRegion.id)
            builder.deleteReference(from: \.countryId, to: \CodeCountry.id)
        
    

更新:我已经添加了 Jacob Relkin 的答案中提到的 enableReferences,但仍然没有抛出异常。

// Configure database
let config = PostgreSQLDatabaseConfig(hostname: "localhost", port: 5432, username: "postgres", database: "test", password: nil, transport: .cleartext)
let postgres = PostgreSQLDatabase(config: config)

// Register the configured database to the database config.
var databases = DatabasesConfig()
databases.add(database: postgres, as: .psql)
databases.enableReferences(on: .psql)
services.register(databases)

【问题讨论】:

【参考方案1】:

为了强制执行外键违规,您必须在设置时在您的DatabasesConfig 上调用enableReferences(on:)

【讨论】:

好的,谢谢。什么标识符用于参数 on: ?是数据库的名字吗? 这是DatabaseIdentifier 啊,如果是 Postgres DB,它是 .psql。感谢您的解决方案。 不幸的是,问题仍然存在,没有抛出异常。我已经用代码更新了我的问题以启用引用。 好的,我刚刚又试了一次,现在可以了!也许有一些缓存问题。谢谢!

以上是关于Vapor fluent 不会在违反外键约束时抛出的主要内容,如果未能解决你的问题,请参考以下文章

此表中的外键约束有啥问题?

Hibernate 无法添加外键约束

违反外键约束

在 Vapor 命令中使用 Fluent

Vapor 3 和 Fluent - 嵌套查询

如何避免使用 JPA 在实体关系中违反外键约束