2010-08-26 5 views
5

Je viens de démarrer un nouveau projet et je voulais utiliser HaskellDB au début. J'ai créé une base de données avec 2 colonnes:Insertion SQL partielle dans haskelldb

create table sensor (
    service text, 
    name text 
); 

..found comment faire les machines de haskelldb de base (ohhh..the de documentation) et je voulais faire un insert. Cependant, je voulais faire un insert partiel (il sont censés être plus colonnes), quelque chose comme:

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

Traduit en haskelldb:

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

Mais ... cela ne fonctionne tout simplement pas . Ce qui ne fonctionne pas non plus, c'est si je spécifie les noms des colonnes dans un ordre différent, ce qui n'est pas vraiment cohérent. Y at-il un moyen de faire un insert partiel dans haskelldb?

Les codes d'erreur que je reçois sont - quand je venez d'insérer une autre colonne (le « nom ») comme le premier:

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.. 

Et quand je fais le « service » comme le premier - et seulement - terrain, je reçois:

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' 

(j'ai deux ou trois autres colonnes dans le tableau) Cela ressemble vraiment « la conception », malheureusement :(

+0

Il serait utile de connaître les erreurs que vous voyez et les types calculés pour certaines expressions intermédiaires. –

Répondre

4

Vous avez raison, ce DOE s regarde intentionnellement. Les documents montrent que HaskellDB.Query insert a un type de:

insert :: (ToPrimExprs r, ShowRecRow r, InsertRec r er) => Database -> Table er -> Record r -> IO() 

la relation InsertRec r er doit détenir en particulier. Cela est défini ailleurs par le programme de type récursif:

InsertRec RecNil RecNil 
(InsertExpr e, InsertRec r er) => InsertRec (RecCons f (e a) r) (RecCons f (Expr a) er) 

La première ligne est le cas de base. La deuxième ligne est un cas inductif. Il veut vraiment marcher chaque élément d'er, la table. Il n'y a pas de court-circuit, et pas de support pour le réapprovisionnement. Mais dans mes propres tests, je l'ai vu ce travail, en utilisant _default:

insQ db = insert db test_tbl1 (c1 <<- (Just 5) # c2 << _default) 

Donc, si vous voulez un insert partiel, vous pouvez toujours dire:

insC1 db x = insert db test_tbl1 (c1 <<- (Just x) # c2 << _default) 
insC2 db x = insert db test_tbl2 (c1 << _default # c2 <<- (Just x)) 

Je sais que ce n'est pas tout ce que vous cherchons. Il semble que InsertRec puisse être réécrit dans le style de HList, pour permettre plus de généralisation. Ce serait une excellente contribution.

Questions connexes