2015-02-25 19:23 GMT+01:00 Aaron Cohen <aa...@assonance.org>: > On Wed, Feb 25, 2015 at 1:08 PM, Cecil Westerhof <cldwester...@gmail.com> > wrote: > >> >> >> 2015-02-25 18:14 GMT+01:00 Andy Fingerhut <andy.finger...@gmail.com>: >> >>> 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 think you would be well-served by a general clojure principle here of > trying to get the data you're are dealing within into "values" as quickly > as possible, and then working with those. > > Rather than inter-mixing your querying and display as you're doing here, I > would design this as a query to fill some maps describing your tables, and > then use clojure.pprint/print-table to print out the resulting map when > desired. > This was just a proof of concept to get things working in the REPL. Later on it should be done much neater. (For example a text based version and a GUI version.) > (printf format field type null key default)) > >> >> (println)) >> (recur (rest all-tables))))))) >> >> It solves both problems. >> >> >> On Wed, Feb 25, 2015 at 8:59 AM, Cecil Westerhof <cldwester...@gmail.com> >>> wrote: >>> >>>> At the moment I have the following function: >>>> (defn do-show-table >>>> [table] >>>> (doseq [{:keys [table_name]} (show-tables db-spec)] >>>> (when (= (lower-case table) (lower-case table_name)) >>>> (let [format "%-20s %-30s %-5s %-5s %-20s\n"] >>>> (printf format "Field" "Type" "Null?" "Key" "Default") >>>> (doseq [{:keys [field type null key default]} >>>> (jdbc/query db-spec [(str "SHOW COLUMNS FROM >>>> " table)])] >>>> (printf format field type null key default)))))) >>>> >>>> In this case it is not very important, because the outer sequence will >>>> not be very big. But I would like to leave the doseq at the moment that the >>>> when is executed. It will be done 0 or 1 times, so after it is done, there >>>> is no use in continuing the sequence walk. >>>> >>>> The second part is that I would like to do an action if it is done 0 >>>> times after the doseq. Is this possible? >>>> >>> -- Cecil Westerhof -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com 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 clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.