As penance, here's an example that is closer to what I was describing:
(require '[clojure.java.jdbc :as j])
(require '[clojure.pprint :as pp])
(def db-spec
{:subprotocol "derby"
:classname "org.apache.derby.jdbc.EmbeddedDriver"
:subname "testDb"
:create true})
(j/db-do-commands db-spec
(j/create-table-ddl :fruit
[:name "varchar(32)" :primary :key]
[:appearance "varchar(32)"]
[:cost :int]
[:grade :real]))
(j/db-do-commands db-spec
(j/create-table-ddl :vegetables
[:name "varchar(32)" :primary :key]
[:appearance "varchar(32)"]
[:cost :int]
[:grade :real]))
;; Print the columns from all application tables
(pp/print-table [:table_name :column_name :type_name :column_size]
(j/with-db-metadata [md db-spec]
(j/metadata-result (.getColumns md nil "APP" nil nil))))
-----------------------------
This produces:
| :table_name | :column_name | :type_name | :column_size |
|-------------+--------------+------------+--------------|
| FRUIT | NAME | VARCHAR | 32 |
| FRUIT | APPEARANCE | VARCHAR | 32 |
| FRUIT | COST | INTEGER | 10 |
| FRUIT | GRADE | REAL | 23 |
| VEGETABLES | NAME | VARCHAR | 32 |
| VEGETABLES | APPEARANCE | VARCHAR | 32 |
| VEGETABLES | COST | INTEGER | 10 |
| VEGETABLES | GRADE | REAL | 23 |
On Wed, Feb 25, 2015 at 1:41 PM, Aaron Cohen <[email protected]> wrote:
> On Wed, Feb 25, 2015 at 1:35 PM, Cecil Westerhof <[email protected]>
> wrote:
>
>> 2015-02-25 19:23 GMT+01:00 Aaron Cohen <[email protected]>:
>>
>>> On Wed, Feb 25, 2015 at 1:08 PM, Cecil Westerhof <[email protected]
>>> > wrote:
>>>
>>>>
>>>>
>>>> 2015-02-25 18:14 GMT+01:00 Andy Fingerhut <[email protected]>:
>>>>
>>>>> doseq does not have anything precisely like C/Java/Perl/etc.'s 'break'
>>>>> or 'continue'. The closest thing might be the :while keyword. You can
>>>>> see
>>>>> some one example of its use near the end of the examples on this page:
>>>>> http://clojuredocs.org/clojure.core/doseq
>>>>>
>>>>> The best way I know to get such behavior is to use Clojure's loop,
>>>>> where if/when/whatever-conditional-statements-you-wish can used to control
>>>>> explicitly to do another loop iteration using recur, or not.
>>>>>
>>>>
>>>> I made the following with loop:
>>>> (defn do-show-table
>>>> [table]
>>>> (loop [all-tables (show-tables db-spec)]
>>>> (let [this-table (get (first all-tables) :table_name)]
>>>> (if (= all-tables ())
>>>> (printf "Table not found: %s\n" table)
>>>> (if (= (lower-case table) (lower-case this-table))
>>>> (let [format "%-20s %-30s %-5s %-5s %-20s\n"]
>>>> (printf "Table %s:\n" table)
>>>> (printf format "Field" "Type" "Null?" "Key" "Default")
>>>> (doseq [{:keys [field type null key default]}
>>>> (jdbc/query db-spec [(str "SHOW COLUMNS FROM "
>>>> table)])]
>>>>
>>>
>>> Please don't get into the habit of doing db queries like this, you're
>>> one "Little Bobby Tables" away from an sql injection. In this case you
>>> should do (jdbc/query db-spec ["SHOW COLUMNS FROM ?" table]).
>>>
>>
>> That gives:
>> JdbcSQLException Syntax error in SQL statement "SHOW COLUMNS FROM ?";
>> expected "identifier"; SQL statement:
>> SHOW COLUMNS FROM ? [42001-184] org.h2.engine.SessionRemote.done
>> (SessionRemote.java:622)
>>
>>
>> That is why I do it in this way. As I understood it this has to do with
>> that with a 'show columns from' the table can not be supplied. (I first
>> tried Yesql, only when that did not work I went to JDBC.)
>>
>>
>
> I see, sorry to jump the gun and be incorrect while doing so.
>
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.