Re: How to insert blobs? (sqlite3 backend)

Daniel Brunner <[email protected]> Sun, 05 Sep 2010 23:20:33 +0200
Newsgroups gmane.lisp.clsql.general
Message-ID <[email protected]>
Hello,

just wanted to ask if someone has any idea with my problem on inserting
blobs into a sqlite3 database.

I appreciate your anwers!

Kind regards, Daniel.

Am 13.07.2010 17:43, schrieb Daniel Brunner:
> Hi everybody,
> 
> I am using CLSQL for a few weeks on a small project. I didn't manage to
> insert a blob into a SQLite3 database. As long as I understood this
> should be possible. I didn't find it in the documentation neither on the
> web. Therefore I would like to raise that question here on the list
> hoping for a hint.
> 
> 1. I create a new database:
> 
> --8<--8<--8<--
> (require 'clsql)
> (use-package :clsql)
> 
> (defvar *x*)
> (enable-sql-reader-syntax)
> 
> (connect '("/home/dbr/test.sqlite") :database-type :sqlite3)
> 
> (create-table [test]
> 	      '(([name] text)
> 		([picture] blob)))
> --8<--8<--8<--
> 
> 
> 2. When I insert a binary file (png file) using another into that table
> using another front end I can select it:
> 
> --8<--8<--8<--
> (setf *x* (caar (select [picture] :from [test]
> 			:where [= [name] "emacs" ] )))
> (type-of *x*)
> ;; --> (SIMPLE-ARRAY (UNSIGNED-BYTE 8) (2162))
> --8<--8<--8<--
> 
> So it seems that the BLOBS come as arrays of type unsigned-byte.
> 
> 3. But I have no clue how to insert a blog into that database using
> CLSQL. One thing I tried for example has been:
> 
> --8<--8<--8<--
> (insert-records :into [test]
> 		:values (list "emacs2"
> 			      *x*))
> --8<--8<--8<--
> 
> But that resulted in an error:
> 
> While accessing database #<SQLITE3-DATABASE /home/dbr/test.sqlite OPEN
> {AD05BE1}>
>   with expression "INSERT INTO TEST VALUES ('emacs2',137,80,78,... )":
>   Error 1 / table TEST has 2 columns but 2163 values were supplied
>   has occurred.
>    [Condition of type SQL-DATABASE-DATA-ERROR]
> 
> Restarts:
>  0: [RETRY] Retry SLIME interactive evaluation request.
>  1: [ABORT] Return to SLIME's top level.
>  2: [TERMINATE-THREAD] Terminate this thread (#<THREAD "worker" RUNNING
> {B26B281}>)
> 
> Backtrace:
>   0: ((SB-PCL::FAST-METHOD CLSQL-SYS:DATABASE-EXECUTE-COMMAND (T
> CLSQL-SQLITE3:SQLITE3-DATABASE)) ..)
>   1: ((LAMBDA (SB-PCL::.PV. SB-PCL::.NEXT-METHOD-CALL. SB-PCL::.ARG0.
> SB-PCL::.ARG1.)) ..)
>   2: ((SB-PCL::FAST-METHOD EXECUTE-COMMAND (STRING)) ..)[:EXTERNAL]
>   3: ((SB-PCL::FAST-METHOD EXECUTE-COMMAND (CLSQL-SYS::%SQL-EXPRESSION))
> ..)[:EXTERNAL]
>   4: (SB-INT:SIMPLE-EVAL-IN-LEXENV (INSERT-RECORDS :INTO
> #<CLSQL-SYS:SQL-IDENT-ATTRIBUTE TEST> :VALUES (LIST "emacs2" *X*))
> #<NULL-LEXENV>)
>   5: ((LAMBDA ()))
> 
> 
> 
> Does anybody can provide a short code snippet that shows how to use
> blobs with SQLite3/CLSQL or provide a link to a how-to?
> 
> I would very much appreciate your help and sorry for the noise if the
> question is too dumb.
> 
> My system:
> Kubuntu 10.04
> SBCL 1.0.40
> CLSQL 5.1.1
> 
> 
> Kind regards, Daniel.
>