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