zoukankan      html  css  js  c++  java
  • Clojure SQL 基础

    Clojure的contrib包中实现了对现有JDBC的封装,在wiki上有连接,该页面上包含了对不同的数据库的连接方法和基本的操作,但是这个页面上没有提供足够的信息,足够一个初学者能够使用Clojure来完成一个SQL操作。本文中我们将利用Clojure和Lein工具,简介一下做开发的基础。当然网上也有非常多对Clojure的SQL操作进行封装的库,我们这里没有使用。

    首先,如何配置你的MySQL数据库。这个各有各的配法,我们就不再多说了。

    其次,在和MySQL的操作中,我们需要两个库,一个是clojure.contrib,另外一个是mysql-connector-java。为了管理和配置这两个库,我们需要配置一下project.clj文件,在depedencies中加上两条:org.clojure/clojure-contrib “1.2.0” 和 mysql/mysql-connector-java “5.1.6”。这样运行 lein deps,就会自动下载并且安装到lib目录下。

    之后,在需要使用sql库的地方要导入这些库。在ns宏中加载如下内容:(:use [clojure.contrib.sql :as sql :only ()),这样在本文件中就可以直接使用sql作为前缀。需要主意的是,虽然我们并没有直接使用到mysql-connector-java,但是如果在lib目录下没有该文件,就会报错没有mysql的driver。

    配置上两条之后,就可以进行sql连接了。

    首先要定义一个database specification,这是一个map,几个必须配置的key包括了:classname, subprotocol, subname, user, password。

    (def db {:classname "com.mysql.jdbc.Driver"
                 :subprotocol "mysql"
                 :subname "//127.0.0.1:3306/test"
                 :user "root"
                 :password "pass"})

    这个db-spec在后面几乎所有的sql操作都是需要的。

    接下来我们主要描述几个常用API的格式,具体的内容可以参考手册。

    1,新建表

    sql/create-table :table-name [:key :type “”] [:key :type “”])

    (defn create-users []
        (sql/create-table
         :user
         [:id :integer "PRIMARY KEY" "AUTO_INCREMENT"]
         [:fname "varchar(25)"]))

    2, 插入数据

    两个api,一个是insert-rows,一个是insert-values。insert-rows需要形成一个完整的行数据插入到表中,insert-values可以按照key来插入值。 

    (defn insert-user [fname]
        (sql/insert-values :users [:fname] [fname]))

    使用insert-values可以利用primary-key的auto_increment的属性

    (defn insert-rows
       []
       (sql/insert-rows :user [1 "Tim"] [2 "Tom"]))

    3,丢弃表

    (defn drop-user
      []
      (try
        (sql/drop-table :fruit)
        (catch Exception _)))

    4, with-query-results 选择查询的数据

    with-query-results 类似于 let 语句,会将查询结果绑定到rs上,rs是一个map构成的sequence。

    (sql/with-query-results rs ["select * from user"]
       (dorun (map #(println %) rs)))

    5, 更新表

    update-values 用来更新表的内容,使用该函数需要指定查询条件,如下图所示

    (defn update-user [id attribute-map]
        (sql/update-values :user ["id=?" id] attribute-map))

    6, 删除行

    (sql/delete-rows :user ["id=?" id])

    7,SQL准备

    clojure支持由用户输入构造sql语句,利用的是sql prepared语句,略

     

    注:所有的sql操作都需要在with-connection宏下包裹着

     

    参考文献:

    【1】http://nakkaya.com/2009/12/14/using-mysql-with-clojure/

    【2】https://github.com/richhickey/clojure-contrib/blob/master/src/test/clojure/clojure/contrib/test_sql.clj

    【3】http://www.webasp.net/article/27/26801_print.htm

    【4】http://en.wikibooks.org/wiki/Clojure_Programming/Examples/JDBC_Examples

  • 相关阅读:
    HTTP请求下载文件格式
    MT7621 加 openWRT 用HTTP和远程服务器通信
    MT7621加 OPENWRT 移植MQTT(paho.mqtt.c) 进行数据的收发
    MT7621安装的openwrt出现无法删除文件的问题
    GAI_LIB = -lanl
    error: expected declaration specifiers or '...' before numeric constant void free(void *);
    environment variable 'STAGING_DIR' not defined
    ubuntu安装 make4.2
    gcc在root权限下查不到版本
    【原创】大叔经验分享(113)markdown语法
  • 原文地址:https://www.cnblogs.com/mmjx/p/2228253.html
Copyright © 2011-2022 走看看