配置 project.clj
增加相关依赖
[org.clojure/java.jdbc "0.7.8"]
[org.xerial/sqlite-jdbc "3.7.15-M1"]
[ragtime "0.8.0"]
配置开发时用户空间
lein repl
启动的时候会默认进入 env/dev/clj
下的 user
命名空间,我们可以把测试代码放到这个命名空间中。
在配置文件中加入以下代码,指定开发时空间的路径
:profiles {
:dev {
:source-paths ["env/dev/clj"]
:plugins [[lein-ancient "0.6.15"]]
:dependencies [[ring/ring-devel "1.6.3"]]}}
注意:要把 :main ^:skip-aot soul-talk.core
注释掉,否则 lein repl
会进入 soul-talk.core
命名空间
静态资源
添加数据库迁移代码
在 resources
目录下新建 migrations
目录,并在 migrations
中新建 001-user.up.sql
文件,在文件中写入创建用户表的语句:
CREATE TABLE IF NOT EXISTS users
(id serial primary key,
name VARCHAR(30),
email VARCHAR(30) unique ,
admin BOOLEAN,
last_login TIME,
is_active BOOLEAN,
password VARCHAR(200) NOT NULL);
在相同目录下新建 001-user-down.sql
DROP TABLE IF EXISTS users;
Clojure
创建 soul-talk/models/db.clj
文件
其中包括数据库规格和数据库操作代码
(ns soul-talk.models.db
(:require [clojure.java.jdbc :as sql]))
(def db-spec
{ :dbtype "sqlite"
:classname "org.sqlite.JDBC"
:subprotocol "sqlite"
:subname "db.sqlite"
:dbname "db.sqlite"})
;; 使用 JDBC 查询语句,返回 3*5
(defn test-db []
(sql/query db-spec "select 3*5 as result"))
(defn save-user! [user]
(sql/insert! db-spec :users user))
(defn select-user [id]
(sql/query db-spec ["SELECT * FROM users where email = ? " id]))
(defn select-all-users []
(sql/query db-spec ["SELECT * from users"]))
创建 env/dev/clj/user.clj
文件
在 env/dev/clj
目录下新建 user.clj
文件,其中创建了一个迁移命令要用的的配置参数变量 config
(ns user
(:require [soul-talk.models.db :as db :refer [db-spec]]
[ragtime.jdbc :as jdbc]
[ragtime.repl :as rag-repl]))
;; 迁移命令需要用到的配置
(def config
{:datastore (jdbc/sql-database db-spec)
:migrations (jdbc/load-resources "migrations")})
运行
在 repl 中运行
(db/test-db)
=> ({:result 15})
迁移命令
(rag-repl/migrate config)
Applying 001-user
=> nil
回滚命令:
(rag-repl/rollback config)
Rolling back 001-user
=> nil