我刚开始了一个新项目,一开始就想用HaskellDB。我创建了一个包含2列的数据库:
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))But...that根本不起作用。同样不起作用的是,如果我以不同的顺序指定列名,这也不是完全一致的。有没有办法在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..当我将“service”作为第一个也是唯一一个字段时,我会得到:
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'(我在表中还有其他几列)不幸的是,这看起来真的很像“设计”:(
发布于 2010-08-30 13:23:10
你说得对,这看起来是故意的。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))我知道这不是你要找的所有东西。看起来可以用HList的风格重写InsertRec,以允许更多的泛化。这将是一个极好的贡献。
https://stackoverflow.com/questions/3574861
复制相似问题