我刚刚开始一个新项目,并希望在开始时使用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 的风格重写,以允许更多的泛化。这将是一个极好的贡献。
| 归档时间: |
|
| 查看次数: |
465 次 |
| 最近记录: |