Common SQL question
Assume the following example
(def-view-class
t1 ()
((id :type integer)
(foreign-id :type integer
:column foreign_id)
(name :db-kind :join
:db-info (:join-class t2
:retrieval :deferred
:target-slot name
:set nil
:home-key foreign-id
:foreign-key id)
:accessor category)))
(def-view-class
t2 ()
((id :type integer
:db-kind :key)
(name :type (string 50))))
(let (db-obj)
(defun full-example ()
(db:connect) ;; use what you need to connect to you database
(drop-view-from-class 't1)
(drop-view-from-class 't2)
(create-view-from-class 't1)
(create-view-from-class 't2)
(enable-sql-reader-syntax)
(insert-records :into [t1]
:values '(1 1))
(insert-records :into [t2]
:values '(1 "eins"))
(setf db-obj (car (car (select 't1
:where [= [slot-value 't1 'id] 1]))))
(print (category db-obj))
(print (car (category db-obj)))))
Output:
(full-example)
("eins" #<db-instance T2 543546020>)
"eins"
"eins"
How could it be that category yields a list?
If there have to be more than one return value why aren't multiple
values returned;
Why do I have to use car on that slot which is definitly not supposed
to be a list?
second question:
How is the correct way to achieve this
(defconstant +some-const+ 1)
(select :from [t1]
:where [= [id] +some-const+])
this yields
Sql-Database-Data-Error id 42000[1064] :
[unixODBC][MySQL][ODBC 3.51
Driver][mysqld-3.23.55]You have an error in your SQL
syntax near 'FROM T1 WHERE (ID = +SOME-CONST+)'
at line 1
Now I can solve it this way
(select [*] :from [t1]
:where [= [id] (sql::lisp-to-sql-formatt +some-const+ 'integer)])
which is questionable at best or:
(select [*] :from [t1]
:where [= [id] #.+some-const+])
which seems to be better but not really the way it is intended to be
used.
Regards
Friedrich