Guest User

Untitled

a guest
Jul 18th, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.50 KB | None | 0 0
  1. (defn reduce-sql-vec
  2. "Takes an array of SQL statement vectors and combines
  3. them into a valid clojure.java.jdbc query vector. In each statement vector
  4. you can have parameters at the end just like a jdbc vector. Easier to show
  5. than explain:
  6.  
  7. take this:
  8. [[\"SELECT * FROM dude\"]
  9. [\" WHERE id = ?\" 1]]
  10.  
  11. and turn it into this:
  12. [\"SELECT * FROM dude WHERE id = ?\" 1]
  13.  
  14. This makes it a little easier to manage queries with large numbers of params."
  15. [sql-vec]
  16. (reduce (fn [acc line]
  17. (-> acc
  18. (update 0 #(str % (first line)))
  19. (into (rest line))))
  20. []
  21. sql-vec))
  22.  
  23. ;; Example
  24. ;;
  25. ;; Requires one to have a db namespace,
  26. ;; JDBC param coercion from java.time.Instant
  27. ;; and a task table with described columns.
  28.  
  29. (require '[clojure.java.jdbc :as sql]
  30. '[java-time :as jt]
  31. '[my.db :as db])
  32.  
  33. (defn sql-test
  34. [id sdt edt]
  35. [["WITH"]
  36. [" totals AS ("]
  37. [" SELECT"]
  38. [" date_trunc('day', created_at) as dt,"]
  39. [" count(1) as total"]
  40. [" FROM"]
  41. [" task"]
  42. [" WHERE"]
  43. [" id = ?" id]
  44. [" AND created_at"]
  45. [" BETWEEN ? AND ?" sdt edt]
  46. [" GROUP BY"]
  47. [" date_trunc('day', created_at)"]
  48. [" )"]
  49. [" SELECT * from totals"]])
  50.  
  51. (def now (jt/instant))
  52.  
  53. (def a-while-ago
  54. (-> now (jt/minus (jt/days 1))))
  55.  
  56. (->> (sql-test 1234 a-while-ago now)
  57. (reduce-sql-vec)
  58. (sql/query db/db))
  59.  
  60. ;; => ({:dt #object[java.time.Instant 0x7474a5fe "2018-07-18T00:00:00Z"], :total 2})
Add Comment
Please, Sign In to add comment