代码之家  ›  专栏  ›  技术社区  ›  ondra

haskelldb中的部分SQL插入

  •  5
  • ondra  · 技术社区  · 15 年前

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

    create table sensor (
        service text,
        name text
    );
    

    insert into sensor (service) values ('myservice');
    

    翻译成HaskellDB:

    transaction db $ insert db SE.sensor (SE.service <<- (Just $ senService sensor))
    

    但是…那根本不管用。同样不起作用的是,如果我以不同的顺序指定列名,这也不完全一致。有没有办法在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..
    

    当我把“服务”作为第一个也是唯一一个字段时,我得到:

    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'
    

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

    1 回复  |  直到 15 年前
        1
  •  4
  •   Brian Sniffen    15 年前

    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的每一个元素,桌子。没有短路,也不支持重新订购。但在我自己的测试中,我看到了这个工作,使用 _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))
    

    推荐文章