2010-08-26 14 views
5

Acabo de iniciar un nuevo proyecto y quería usar HaskellDB al principio. He creado una base de datos con 2 columnas:Insertar SQL parcial en haskelldb

create table sensor (
    service text, 
    name text 
); 

..found la manera de hacer la maquinaria HaskellDB básica (ohhh..the documentación) y quería hacer una inserción. Sin embargo, lo que quería hacer una inserción parcial (no se supone que son más columnas), algo así como:

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

Traducido a HaskellDB:

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

Pero ... que simplemente no funciona . Lo que tampoco funciona es si especifico los nombres de las columnas en orden diferente, que tampoco es exactamente coneniente. ¿Hay alguna manera de hacer una inserción parcial en haskelldb?

Los códigos de error que recibo son - cuando acaba de insertar una columna diferente (el 'nombre') como el primero:

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

Y cuando lo haga el 'servicio' como la primera - y sólo - campo, me sale:

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' 

(tengo un par de otras columnas de la tabla) Esto se ve realmente como 'mediante el diseño', por desgracia :(

+0

Sería útil saber qué errores ve y los tipos calculados para algunas expresiones intermedias. –

Respuesta

4

tienes razón, que Doe s mirada intencional. Los docs HaskellDB.Query mostrar que insert tiene un tipo de:

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

En particular, la relación InsertRec r er debe sostener. Eso está definido en otro lugar por el programa de tipo recursivo:

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

La primera línea es el caso base. La segunda línea es un caso inductivo. Realmente quiere caminar cada elemento de er, la mesa. No hay cortocircuito ni soporte para reordenar. Pero en mis propias pruebas, he visto este trabajo, utilizando _default:

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

Así que si quieres una inserción parcial, siempre se puede decir:

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

Sé que esto no es todo lo que 'que estas buscando. Parece que InsertRec se puede volver a escribir en el estilo de HList, para permitir una mayor generalización. Esa sería una excelente contribución.

Cuestiones relacionadas