ivaneye.com

Luminus手册-访问数据库

Configuring the Database

当你使用数据库参数来创建Luminus工程时,比如+postgress,那么Luminus会使用Korma来处理数据库操作.

Korma是一个基于Clojure的数据库操作DSL。Korma提供了一套简单的接口,方便你来处理复杂的数据。

给一个现有的项目添加数据库支持,非常的简单。首先,你需要在project.clj文件中添加Korma依赖。

[korma "0.4.0"]

另外还需要相应数据库的驱动,所以你还需要在project.clj中添加相关的数据库驱动。比如说,你要连接PostreSQL数据库,你需要添加如下的依赖.

[postgresql/postgresql "9.3-1102-jdbc41"]

添加完依赖后,你可以创建一个新的namespace来管理你的model,这个namespace建议叫db.core。你需要在里面引入korma.db。

(ns myapp.db.core
  (:use korma.core
        [korma.db :only (defdb)]))

Setting up the database connection

配置完依赖后,我们要做的事情就是定义数据库连接。我们只需要提供一个包含连接信息的map。

(def db-spec {:subprotocol "postgresql"
         :subname "//localhost/my_website"
         :user "admin"
         :password "admin"})

或者也可以配置服务器提供的JNDI名称来创建连接。

(def db-spec {:name "jdbc/myDatasource"})

这种方式适合当你有多个连接的时候。比如说,你有个dev/staging/production 服务器,你可以将JNDI连接指向它所配置的数据库。应用程序将会从环境中来加 载数据库连接信息。这意味着,你可以随意的改变你的数据库连接,而不需要修 改你的代码。 最后,你能自己配置JDBC连接:

(def db-spec
  {:datasource
    (doto (new PGPoolingDataSource)
     (.setServerName   "localhost")
     (.setDatabaseName "my_website")
     (.setUser         "admin")
     (.setPassword     "admin")
     (.setMaxConnections 10))})

Creating tables

Korma依赖clojure.java.jdbc.这个库提供操作表的功能。

你可以使用create-table函数来从应用中创建数据表。

(defn create-users-table []
  (sql/db-do-commands db-spec
    (sql/create-table-ddl
      :users
      [:id "varchar(32)"]
      [:pass "varchar(100)"])))

create-table-ddl函数需要包含在db-do-commands内,db-do-commands保证了数据库连接的关闭。

Accessing the Database

当使用Korma时,你需要先用defdb来包裹db-spec。

(defdb db schema/db-spec)

这将会使用c3p0来创建一个连接池。需要注意的是,最后创建的连接池会被设为默认的连接池。

Korma使用entities来表示sql表。这个entities构成了你查询的核心。

entities使用defentity宏来创建:

(defentity users)

我们可以这样来创建user:

(defn create-user [user]
  (insert users
          (values user)))

而如果我们想查询user,我们可以这样写:

(defn get-user [id]
  (first (select users
                 (where {:id id})
                 (limit 1))))

详细文档可参考Korma官网

Yesql

Korma提供了操作SQL的DSL,而Yesql可以直接操作SQL.

如果要使用Yesql你需要添加依赖:

[yesql "0.4.0"]

当你在classpath下创建一个包含查询的SQL文件,比如resources/queries.sql.文件格式如下:

    -- name: find-users
    -- Find the users with the given ID(s).
    SELECT *
    FROM user
    WHERE user_id IN (:id)
    AND age > :min_age
    -- name: user-count
    -- Counts all the users.
    SELECT count(*) AS count
    FROM user

创建问上述文件后,你需要在需要的地方引入yesql.core/defqueries。

(ns myapp.db.core
  (:require [yesql.core :refer [defqueries]]))
(defqueries "resources/queries.sql")

每个查询可以像函数一样通过名字来调用。

(find-users db-spec [1001 1003 1005] 18)