我在这里再次寻求帮助。 :) 我试图使用F#将数据插入我的MySQL数据库。 我的架构包括3个表(实验,基因和结果):
Experiments | Results | Gene
Experiment id | Experiment id | Gene id
Experiment name | Gene id | Gene Name
| Value |
现在,我尝试使用SQLProvider将数据添加到数据库中。
let db = sql.GetDataContext()
let gene_tb = db.Vp32.Genes
let exp_tb = db.Vp32.Experiments
let results_tb = db.Vp32.Results
let createNewInput (genename: string) (expname: string) res =
let newRes = results_tb.Create()
let newGene = gene_tb.Create()
let newExp = exp_tb.Create()
newGene.GeneName <- genename
newExp.ExpName <- expname
newRes.ResultVal <- Some res
createNewInput "test1" "experiment_test1" (float32 999.5)
db.SubmitUpdates()
我有问题要让它理解结果值与实验和基因ID 相关联。我尝试提交时出错: &#34; 字段&#39; Exp_id&#39;没有默认值&#34;。好吧,没有默认值,因为它应该是其他表的ID。哦,和..这些ID设置为自动增加。 此外,每次添加新数据时,如果表中已存在实验名称,则id不应增加。我是否必须做一些类似“触发器”的事情。对于这个或一些规范代码使用&#39; if ... then&#39;?
非常感谢您提前! :d 多亏了你,我已经学到了很多东西,我无法相信! ^ - ^
解决方案:所以,我发现问题是我必须查询实验和基因的ID。所以我改变了一些东西。现在我有3个函数(每个表一个),结果一个函数在添加结果值之前做一个小查询:
let addNewExp (expname: string)=
let newExp = exp_tb.Create()
newExp.ExpName <- expname
db.SubmitUpdates()
let addNewGene (genename: string)=
let newGene = gene_tb.Create()
newGene.GeneName <- genename
db.SubmitUpdates()
let addNewRes (expName: string) (geneName: string) res =
let tempExpId =
query {
for experiment in exp_tb do
where (experiment.ExpName = expName)
select experiment.ExpId
}
|> Seq.head
let tempGeneId =
query {
for gene in gene_tb do
where (gene.GeneName = geneName)
select gene.GeneName
}
|> Seq.toArray |> String.concat ""
let newRes = results_tb.Create()
newRes.ExpId <- tempExpId
newRes.GeneId <- tempGeneId
newRes.ResultVal <- Some res
db.SubmitUpdates()
实际上,在关联表(结果)中添加内容之前,必须执行查询以获取id值。之后我只是转换为正确的类型(在数据库中描述),因为查询返回为序列(Seq)。 我希望这也可以帮助将来的某个人。
答案 0 :(得分:2)
我实际上没有尝试过这个,所以它可能不对 - 但我认为一个应该有效的策略是先将Experiment
记录(ExpName
)与{{1}一起插入用Gene
记录。
当您再调用GeneName
时,提供者应插入两条记录(这应该有效,因为它们具有所需的所有字段)并填写SubmitUpdates
和Experiment id
属性插入的记录。
然后您拥有这些ID,因此您应该创建一个包含所有正确ID的新Gene id
记录,插入并再次致电Result
。
(可能有更好的方法,但这可以解决问题......)