06 - 增加数据库功能

06 - 增加数据库功能.png

配置 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

推荐阅读更多精彩内容