I have been able to access tables in mysql, but not able to add
records. I look at the examples fo "fruit so I created a lein named
fruitI made th project file as the mysql project file. I copied the
database instructions as in mysql. I added all of the statements for
the "fruit" example but I can't even get it to access the connection
or the database
Doesn't this statement access the mysql db? :
(sql/with-connection db
Here is the project file ;
defproject fruit "1.0.0-SNAPSHOT"
:description "FIXME: write description"
:dependencies [[org.clojure/clojure "1.3.0"]]
[org.clojure/java.jdbc "0.0.6"]
[mysql/mysql-connector-java "5.1.6"])
here is the core file;
(ns fruit.core
(:require [clojure.java.jdbc :as sql]))
(defn db {:classname "com.mysql.jdbc.Driver"
:subprotocol "mysql"
:subname "//localhost:3306/world"
:user "root"
:password "pass"})
(defn create-fruit []
(sql/with-connection db
(sql/create-table
:fruit
[:id :integer "PRIMARY KEY" "AUTO_INCREMENT"]
[:name "varchar(25)"]
[:appearance "varchar(25)"]
[:cost "integer(5)"]))
; Inserting multiple rows
;If you want to insert complete rows, you can use insert-rows and
provide the values as a simple vector for each row. Every column's
value must be present in the same order the columns are declared in
the table. This performs a single insert statement. If you attempt to
insert a single row, a map of the generated keys will be returned.
(defn insert-rows-fruit
"Insert complete rows"
[]
(sql/insert-rows
:fruit
["Apple" "red" 59 87]
["Banana" "yellow" 29 92.2]
["Peach" "fuzzy" 139 90.0]
["Orange" "juicy" 89 88.6]))
;Inserting partial rows
;If you want to insert rows but only specify some columns' values, you
can use insert-values and provide the names of the columns following
by vectors containing values for those columns. This performs a single
insert statement. If you attempt to insert a single row, a map of the
generated keys will be returned.
(defn insert-values-fruit
"Insert rows with values for only specific columns"
[]
(sql/insert-values
:fruit
[:name :cost]
["Mango" 722]
["Feijoa" 441]))
;Inserting a record
;If you want to insert a single record, you can use insert-record and
specify the columns and their values as a map. This performs a single
insert statement. A map of the generated keys will be returned.
(defn insert-record-fruit
"Insert a single record, map from keys specifying columsn to values"
[]
(sql/insert-record
:fruit
{:name "Pear" :appearance "green" :cost 99}))
;Inserting multiple records
;If you want to insert multiple records, you can use insert-records
and specify each record as a map of columns and their values. This
performs a separate insert statement for each record. The generated
keys are returned in a sequence of maps.
(defn insert-records-fruit
"Insert records, maps from keys specifying columns to values"
[]
(sql/insert-records
:fruit
{:name "Pomegranate" :appearance "fresh" :cost 585}
{:name "Kiwifruit" :grade 93}))
;Using transactions
;You can write multiple operations in a transaction to ensure they are
either all performed, or all rolled back.
(defn db-write
"Write initial values to the database as a transaction"
[]
(sql/with-connection db
(sql/transaction
; (drop-fruit)
(create-fruit)
(insert-rows-fruit)
(insert-values-fruit)
(insert-records-fruit)))
nil)
;Reading and processing rows
;To execute code against each row in a result set, use with-query-
results with SQL.
(defn db-read
"Read the entire fruit table"
[]
(sql/with-connection db
(sql/with-query-results res
["SELECT * FROM fruit"]
(doseq [rec res]
(println rec)))))
(defn db-read-all
"Return all the rows of the fruit table as a vector"
[]
(sql/with-connection db
(sql/with-query-results res
["SELECT * FROM fruit"]
(into [] res))))
(defn db-grade-range
"Print rows describing fruit that are within a grade range"
[min max]
(sql/with-connection db
(sql/with-query-results res
[(str "SELECT name, cost, grade "
"FROM fruit "
"WHERE grade >= ? AND grade <= ?")
min max]
(doseq [rec res]
(println rec)))))
(defn db-grade-a
"Print rows describing all grade a fruit (grade between 90 and 100)"
[]
(db-grade-range 90 100))
;Updating values across a table
;To update column values based on a SQL predicate, use update-values
with a SQL where clause and a map of columns to new values. The result
is a sequence of update counts, indicating the number of records
affected by each update (in this case, a single update and therefore a
single count in the sequence).
(defn db-update-appearance-cost
"Update the appearance and cost of the named fruit"
[name appearance cost]
(sql/update-values
:fruit
["name=?" name]
{:appearance appearance :cost cost}))
(defn db-update
"Update two fruits as a transaction"
[]
(sql/with-connection db
(sql/transaction
(db-update-appearance-cost "Banana" "bruised" 14)
(db-update-appearance-cost "Feijoa" "green" 400)))
nil)
;Updating values or Inserting records conditionally
;If you want to update existing records that match a SQL predicate or
insert a new record if no existing records match, use update-or-insert-
values with a SQL where clause and a map of columns to values. This
calls update-values first and if no rows were updated, this calls
insert-values. The result is either the sequence of update counts from
the update or the sequence of generated key maps from the insert.
(defn db-update-or-insert
"Updates or inserts a fruit"
[record]
(sql/with-connection db
(sql/update-or-insert-values
:fruit
["name=?" (:name record)]
record)))
;Exception Handling and Transaction Rollback
;Transactions are rolled back if an exception is thrown, as shown in
these examples.
(defn db-exception
"Demonstrate rolling back a partially completed transaction on
exception"
[]
(sql/with-connection db
(sql/transaction
(sql/insert-values
:fruit
[:name :appearance]
["Grape" "yummy"]
["Pear" "bruised"])
;; at this point the insert-values call is complete, but the
transaction
;; is not. the exception will cause it to roll back leaving the
database
;; untouched.
(throw (Exception. "sql/test exception")))))
(defn db-sql-exception
"Demonstrate an sql exception"
[]
(sql/with-connection db
(sql/transaction
(sql/insert-values
:fruit
[:name :appearance]
["Grape" "yummy"]
["Pear" "bruised"]
["Apple" "strange" "whoops"]))))
(defn db-batchupdate-exception
"Demonstrate a batch update exception"
[]
(sql/with-connection db
(sql/transaction
(sql/do-commands
"DROP TABLE fruit"
"DROP TABLE fruit"))))
(defn db-rollback
"Demonstrate a rollback-only trasaction"
[]
(sql/with-connection db
(sql/transaction
(prn "is-rollback-only" (sql/is-rollback-only))
(sql/set-rollback-only)
(sql/insert-values
:fruit
[:name :appearance]
["Grape" "yummy"]
["Pear" "bruised"])
(prn "is-rollback-only" (sql/is-rollback-only))
(sql/with-query-results res
["SELECT * FROM fruit"]
(doseq [rec res]
(println rec))))
(prn)
(sql/with-query-results res
["SELECT * FROM fruit"]
(doseq [rec res]
(println rec)))))
;Copyright 2007-2011 by Rich Hickey and the various contributors
;Logo & site design by Tom Hickey.
doesn't the
--
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