2010-08-26 74 views
5

我刚开始一个新项目,并想在开始时使用HaskellDB。我创建了一个数据库2列:haskelldb中的部分SQL插入

create table sensor (
    service text, 
    name text 
); 

..found如何做基本HaskellDB机械(ohhh..the文档),想要做一次插入。然而,我想要做的部分插入(也应该是多列),是这样的:

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' 

(我有表一对夫妇的其他列) 这看起来真像“设计”,不幸的是:(

+0

这将有助于了解您看到的错误以及为某些中间表达式计算的类型。 – 2010-08-27 19:47:53

回答

4

你说得对,那母鹿看起来有意为之。该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) 

第一行是基本情况。第二行是一个归纳案例。它确实想要走呃桌子的每一个元素。没有短路,也不支持重新排序。但在我自己的测试,我看到了这个工作,用_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)) 

我知道这不是你的一切正在寻找。它看起来像InsertRec可以重写为HList的风格,以允许更一般化。这将是一个很好的贡献。