gpt4 book ai didi

sql - 在Haskell中进行部分SQL插入

转载 作者:行者123 更新时间:2023-12-04 20:23:33 24 4
gpt4 key购买 nike

我刚刚开始一个新项目,并想在一开始使用HaskellDB。我创建了一个包含2列的数据库:

create table sensor (
service text,
name text
);

..找到了基本的HaskellDB机制的方法(哦,..文档),并想做一个插入。但是,我想进行部分插入(应该有更多的列),例如:
insert into sensor (service) values ('myservice');

转换为HaskellDB:
transaction db $ insert db SE.sensor (SE.service <<- (Just $ senService sensor))

但是...那根本行不通。如果我以不同的顺序指定列名,那也是行不通的,这也不是完全正确的。有没有办法在haskelldb中进行部分插入?

我得到的错误代码是-当我刚插入另一列(“名称”)作为第一列时:
Couldn't match expected type `SEI.Service'
against inferred type `SEI.Name'
Expected type: SEI.Intsensor
Inferred type: Database.HaskellDB.HDBRec.RecCons
SEI.Name (Expr String) er
When using functional dependencies to combine
Database.HaskellDB.Query.InsertRec
(Database.HaskellDB.HDBRec.RecCons f (e a) r)
(Database.HaskellDB.HDBRec.RecCons f (Expr a) er),
etc..

当我将“服务”作为第一个也是唯一一个字段时,我得到:
Couldn't match expected type `Database.HaskellDB.HDBRec.RecCons
SEI.Name
(Expr String)
(Database.HaskellDB.HDBRec.RecCons
SEI.Time
(Expr Int)
(Database.HaskellDB.HDBRec.RecCons
SEI.Intval (Expr Int) Database.HaskellDB.HDBRec.RecNil))'
against inferred type `Database.HaskellDB.HDBRec.RecNil'

(我在表中还有其他几列)
不幸的是,这看起来真的像是“通过设计”:

最佳答案

没错,这确实是故意的。 HaskellDB.Query文档显示insert具有以下类型:

insert :: (ToPrimExprs r, ShowRecRow r, InsertRec r er) => Database -> Table er -> Record r -> IO ()

特别是,关系 InsertRec r er必须成立。这是在递归类型程序的其他地方定义的:
InsertRec RecNil RecNil
(InsertExpr e, InsertRec r er) => InsertRec (RecCons f (e a) r) (RecCons f (Expr a) er)

第一行是基本情况。第二行是感应情况。它确实的确想遍历er的每个元素,即 table 。没有短路,也不支持重新排序。但是在我自己的测试中,我已经使用 _default看到了这项工作:
insQ db = insert db test_tbl1 (c1 <<- (Just 5) # c2 << _default)

因此,如果要部分插入,可以始终说:
insC1 db x = insert db test_tbl1 (c1 <<- (Just x) # c2 << _default)
insC2 db x = insert db test_tbl2 (c1 << _default # c2 <<- (Just x))

我意识到这不是您要查找的所有内容。看起来可以按照HList的样式重写InsertRec,以实现更多通用化。那将是一个杰出的贡献。

关于sql - 在Haskell中进行部分SQL插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3574861/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com