haskelldb中的部分SQL插入

ond*_*dra 5 sql haskell

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

create table sensor (
    service text,
    name text
);
Run Code Online (Sandbox Code Playgroud)

..找出如何做基本的HaskellDB机器(哦......文档),并想做一个插入.但是,我想做一个部分插入(应该有更多的列),类似于:

insert into sensor (service) values ('myservice');
Run Code Online (Sandbox Code Playgroud)

转换为HaskellDB:

transaction db $ insert db SE.sensor (SE.service <<- (Just $ senService sensor))
Run Code Online (Sandbox Code Playgroud)

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

我得到的错误代码是 - 当我刚插入另一列('name')作为第一个时:

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..
Run Code Online (Sandbox Code Playgroud)

当我将'服务'作为第一个 - 也是唯一的 - 字段时,我得到:

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'
Run Code Online (Sandbox Code Playgroud)

(我在表中还有其他一些列)这看起来非常像'设计',不幸的是:(

小智 4

你说得对,这看起来确实是故意的。HaskellDB.Query 文档显示其insert类型为:

insert :: (ToPrimExprs r, ShowRecRow r, InsertRec r er) => Database -> Table er -> Record r -> IO ()
Run Code Online (Sandbox Code Playgroud)

特别是,该关系InsertRec r er必须成立。这是由递归类型程序在其他地方定义的:

InsertRec RecNil RecNil
(InsertExpr e, InsertRec r er) => InsertRec (RecCons f (e a) r) (RecCons f (Expr a) er)
Run Code Online (Sandbox Code Playgroud)

第一行是基本情况。第二行是一个归纳案例。它确实想要遍历呃桌子的每个元素。不存在短路,也不支持重新排序。但在我自己的测试中,我看到了这项工作,使用_default

insQ db = insert db test_tbl1 (c1 <<- (Just 5) # c2 << _default)
Run Code Online (Sandbox Code Playgroud)

因此,如果您想要部分插入,您可以随时说:

insC1 db x = insert db test_tbl1 (c1 <<- (Just x) # c2 << _default)
insC2 db x = insert db test_tbl2 (c1 << _default  # c2 <<- (Just x))
Run Code Online (Sandbox Code Playgroud)

我意识到这并不是您要寻找的一切。看起来 InsertRec 可以按照 HList 的风格重写,以允许更多的泛化。这将是一个极好的贡献。