Fluent 迁移看起来正常,但由于错误而失败

Fluent 迁移看起来正常,但由于错误而失败,fluent,vapor,Fluent,Vapor,我在MySQL数据库中创建了我的模型,这是可行的 现在我想给数据库添加一些演示数据,因此我创建了一个SeedDB迁移,其唯一目的是(当然,这个迁移是在创建所有模型迁移之后运行的) struct-SeedDB:迁移{ func prepare(关于数据库:database)->EventLoopFuture{ Setup.createDemoData(数据库:数据库) ... } } 我创建了一个安装模型来做安装工作,目前它只是创建演示数据,但将来可能会用于其他事情 最终课程设置{ 静态func

我在MySQL数据库中创建了我的模型,这是可行的

现在我想给数据库添加一些演示数据,因此我创建了一个SeedDB迁移,其唯一目的是(当然,这个迁移是在创建所有模型迁移之后运行的)

struct-SeedDB:迁移{
func prepare(关于数据库:database)->EventLoopFuture{
Setup.createDemoData(数据库:数据库)
...
}
}
我创建了一个安装模型来做安装工作,目前它只是创建演示数据,但将来可能会用于其他事情

最终课程设置{
静态func createDemoData(数据库:数据库){
让{Address.createDemoData(数据库:database).map{Address in
让{Site.createDemoData(地址:address,数据库:database).map{Site in
let=Appointment.createDemoData(站点:站点,数据库:数据库)
let=Company.createDemoData(站点:站点,数据库:数据库)
让。。。。
}
}
}
}
正如你所看到的,我必须嵌套一些呼叫,因为没有地址就无法创建站点。约会、公司和其他人需要有一个站点作为参数。。。(在使用@Parent relations定义的模型中)

在从一个地址创建一个站点的层面上,这个工作(正如预期的)完美。但是,如果我想创建约会(或公司),则会出现问题,即使迁移似乎成功,也会出现错误:

你想继续吗? 是/否>是 迁移成功 致命错误:在展开可选值(文件NIO/CircularBuffer.swift,第538行)时意外发现nil

我的模型看起来像:

在我的每个型号中,我都有以下功能版本之一(取决于需要):

static func createDemoData(数据库:数据库)->EventLoopFuture{
让newMyModel=myModel(参数1:“一些东西”,参数2:“演示信息”)
返回newMyModel.save(在:database.map{newMyModel}
}
或 静态func createDemoData(站点:站点数据库:数据库)->EventLoopFuture{

让newMyModel=myModel(param1:“一些东西”,param2:“演示信息”)
返回newMyModel.save(在:database.map{newMyModel}
}
或类似的

仅供参考在约会或公司中删除createDemoData中的.save(on:database)会使错误不会发生(但也不会将实例保存到数据库)


添加了每个0xTim请求的型号约会

static func createDemoData(站点:站点,数据库:数据库)->[约会]{
预约:预约
var预约:[预约]=[]
让今天=日期()
let day=时间间隔(24.0*3600.0)
//计划任命
约会=约会(siteID:site.id!,约会日期:(今天+(3天)),说明:“打电话给詹姆斯·邦德”)
让ux=appointment.save(在:数据库上)
预约。附加(预约)
....
据我所知,site.id!不是罪魁祸首,因为它是在安装模型中创建的,在关闭时带有约会的createDemoData。(参见上面的代码)


为每个0xTim请求的站点类添加createDemoData

static func createDemoData(地址:地址,数据库:数据库)->EventLoopFuture{
let site=site(名称:“mySite”,地址id:address.id!)
返回site.save(在:database.map{site}
}

同样,address.id!也不应该是问题所在,因为Site.createDemoData正在关闭地址创建(因此它应该存在)(

您的问题是您没有处理您的未来。每次您这样做时

let\uux=appointment.save(在:数据库上)
或者类似地,无论保存是否已返回或是否成功,您都会告诉编译器立即返回。您需要使用
map
/
flatMap
正确处理未来。迁移也是如此

let=Address.createDemoData(数据库:database).map{Address in
让{Site.createDemoData(地址:address,数据库:database).map{Site in
let=Appointment.createDemoData(站点:站点,数据库:数据库)
let=Company.createDemoData(站点:站点,数据库:数据库)
让。。。。
}
}

没有保证(而且很有可能)在
地址
完成之前,您将尝试创建
约会
,等等

我在创建具有可选字段的模型实例时看到此错误。虽然该字段是可选的,但vapor似乎需要对其进行初始化。您是否可能在某个地方隐藏了其中一个?您的建议是什么为约会或公司创建类似的功能,以及您如何在这些功能中使用站点?@0xTim:将约会创建添加到文本中,这也是我的第一个想法,但如果您查看我的代码(我文章的第二块),您将看到约会是在关闭站点时创建的,也就是在关闭地址时创建的(站点创建得非常完美)站点的CreateDemodData功能是什么样子的?将其添加到原始帖子如果您删除所有强制展开并将其替换为guard let’s并添加一条消息,它在哪里失败?