首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >haskelldb中的部分SQL插入

haskelldb中的部分SQL插入
EN

Stack Overflow用户
提问于 2010-08-26 20:04:03
回答 1查看 468关注 0票数 5

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

代码语言:javascript
复制
create table sensor (
    service text,
    name text
);

..found出了如何做基本的HaskellDB机制(ohhh..the文档),并想做一个插入。但是,我想做一个部分插入(应该有更多的列),如下所示:

代码语言:javascript
复制
insert into sensor (service) values ('myservice');

翻译成HaskellDB:

代码语言:javascript
复制
transaction db $ insert db SE.sensor (SE.service <<- (Just $ senService sensor))

But...that根本不起作用。同样不起作用的是,如果我以不同的顺序指定列名,这也不是完全一致的。有没有办法在haskelldb中执行部分插入?

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

代码语言:javascript
复制
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”作为第一个也是唯一一个字段时,我会得到:

代码语言:javascript
复制
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'

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-08-30 13:23:10

你说得对,这看起来是故意的。HaskellDB.Query文档显示insert具有以下类型:

代码语言:javascript
复制
insert :: (ToPrimExprs r, ShowRecRow r, InsertRec r er) => Database -> Table er -> Record r -> IO ()

特别是,InsertRec r er必须持有的关系。在别处由递归类型程序定义:

代码语言:javascript
复制
InsertRec RecNil RecNil
(InsertExpr e, InsertRec r er) => InsertRec (RecCons f (e a) r) (RecCons f (Expr a) er)

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

代码语言:javascript
复制
insQ db = insert db test_tbl1 (c1 <<- (Just 5) # c2 << _default)

因此,如果你想要一个部分插入,你总是可以说:

代码语言:javascript
复制
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,以允许更多的泛化。这将是一个极好的贡献。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3574861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档