我放弃了尝试与 Korma 一起做这件事。我认为使用基本的 SQL 互操作可能会更好:
(ns tst.demo.jdbc
(:use demo.core tupelo.core tupelo.test)
(:require
[clojure.java.jdbc :as jdbc]
[clojure.string :as str]
[clojure.java.io :as io] ))
(def db {:classname "org.h2.Driver"
:subprotocol "h2:mem"
;:subname "./korma.db"
:subname "demo;DB_CLOSE_DELAY=-1" ; -1 very important!!!
; http://www.h2database.com/html/features.html#in_memory_databases
; http://makble.com/using-h2-in-memory-database-in-clojure
:user "sa"
:password ""
})
(dotest
(spyx (jdbc/db-do-commands db ["drop table if exists langs"]))
(spyx (jdbc/db-do-commands db ["drop table if exists releases"]))
(spy :create
(jdbc/db-do-commands
db
(jdbc/create-table-ddl :langs
[[:id :serial]
[:lang "varchar not null"]])))
(spy :create
(jdbc/db-do-commands
db
(jdbc/create-table-ddl :releases
[[:id :serial]
[:desc "varchar not null"]
[:langId "numeric"]])))
(spy :insert
(jdbc/insert-multi! db :langs
[{:lang "Clojure"}
{:lang "Java"}]))
;; -> ({:lang "Clojure", :id 1} {:lang "Java", :id 2})
(spyx-pretty (jdbc/query db ["select * from langs"]))
(let [clj-id (grab :id (only (jdbc/query db ["select id from langs where lang='Clojure'"])))]
(spyx clj-id)
(spy :insert-rel
(jdbc/insert-multi! db :releases
[{:desc "ancients" :langId clj-id}
{:desc "1.8" :langId clj-id}
{:desc "1.9" :langId clj-id}])) )
(let [java-id (grab :id (only (jdbc/query db ["select id from langs where lang='Java'"])))]
(spyx java-id)
(spy :insert-rel
(jdbc/insert-multi! db :releases
[{:desc "dusty" :langId java-id}
{:desc "8" :langId java-id}
{:desc "9" :langId java-id}
{:desc "10" :langId java-id}])) )
(spyx-pretty
(jdbc/query db [
"select langs.lang, releases.desc
from langs inner join releases
on (langs.id = releases.langId)
where lang = 'Clojure' "]) )
)
结果:
(jdbc/db-do-commands db ["drop table if exists langs"]) => (0)
(jdbc/db-do-commands db ["drop table if exists releases"]) => (0)
:create => (0)
:create => (0)
:insert => ({:id 1} {:id 2})
(jdbc/query db ["select * from langs"]) =>
({:id 1, :lang "Clojure"} {:id 2, :lang "Java"})
clj-id => 1
:insert-rel => ({:id 1} {:id 2} {:id 3})
java-id => 2
:insert-rel => ({:id 4} {:id 5} {:id 6} {:id 7})
(jdbc/query db ["select langs.lang, releases.desc\n from langs inner join releases\n on (langs.id = releases.langId)\n where lang = 'Clojure' "]) =>
({:lang "Clojure", :desc "ancients"}
{:lang "Clojure", :desc "1.8"}
{:lang "Clojure", :desc "1.9"})