joplin, 面向Clojure项目的灵活数据存储迁移和种子配置

分享于 

14分钟阅读

GitHub

  繁體 雙語
Flexible datastore migration and seeding for Clojure projects
  • 源代码名称:joplin
  • 源代码网址:http://www.github.com/juxt/joplin
  • joplin源代码文档
  • joplin源代码下载
  • Git URL:
    git://www.github.com/juxt/joplin.git
    Git Clone代码到本地:
    git clone http://www.github.com/juxt/joplin
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/juxt/joplin
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    

    在 0.2发布了许多重大变更,请参阅这里以了解详情。

    Joplin是一个灵活的数据存储迁移和。

    Joplin试图解决在处理由多个数据存储组成的复杂系统时出现的问题。 它允许你定义和解释环境的( 例如开发,登台,UAT,产品)。

    Joplin允许你声明 databasesmigratorsseed functions,并将它们组合到不同的environments 中。 它可以从REPL中使用,通过一个 leiningen 别名或者以编程方式调用。

    Joplin提供了用于 sql/jdbc数据库。Datomic。ElasticSearch。Cassandra。DynamoDB。Hive和Zookeeper的插件。 它是以可以扩展性构建的,添加更多的存储是由多种方法来完成的。

    Joplin是建立在 ragtime的顶部。

    安装

    如果只希望数据库独立的核心,则添加 joplin.core 作为依赖项:

    :dependencies [[joplin.core "0.3.10"]]

    如果你没有使用;,请为要迁移的数据库插件添加一个依赖项。

    :dependencies [[joplin.cassandra "0.3.10"]
     [joplin.dynamodb "0.3.10"]
     [joplin.datomic "0.3.10"]
     [joplin.elasticsearch "0.3.10"]
     [joplin.hive "0.3.10"]
     [joplin.jdbc "0.3.10"]
     [joplin.zookeeper "0.3.10"]]

    使用 Joplin

    定义配置映射

    joplin配置图包含密钥 :databases:migrators:seeds:environments。 前三个是纯声明,而 :environments 是这些声明组合在。 有关这 4个键的更多细节,请参见页面

    通常,你将在一个 .edn 文件中定义配置,你将它放在类路径的某个地方。

    请注意,使用migrators和种子var命名空间的文件夹需要在路径中,以便访问它们。 Joplin还将在类路径中查找包含匹配名称的资源文件夹的任何 jar 文件。

    ;定义的示例

    {
    :migrators {:sql-mig"joplin/migrators/sql"} ;; A path for a folder with migration files:seeds {:sql-seed"seeds.sql/run";; A clojure var (function) that applies the seed:es-seed"seeds.es/run"}
    :databases {:sql-dev {:type:jdbc, :url"jdbc:h2:mem:dev"}
     :es-prod {:type:es, :host"es-prod.local", :port"9300", :cluster"dev"}
     :sql-prod {:type:jdbc, :url"jdbc:h2:file:prod"}};; We combine the definitions 上面 into different environments:environments {:dev [{:db:sql-dev, :migrator:sql-mig, :seed:sql-seed}]
     :prod [{:db:sql-prod, :migrator:sql-mig}
     {:db:es-prod}, :seed:es-seed]}
    }

    从配置映射隐藏秘密

    一旦配置映射被写入 .edn 文件,你需要读取该文件并传递datastructure迁移of和种子函数。 JDBC连接字符串通常包括你不希望放入源代码管理的用户名和密码。

    joplin.repl 命名空间提供一个名为 load-config的函数,该函数在类路径( joplin.edn ) 上获取 NAME ( 或者 URL ) 并读取将它转换为 Clojure datastructures。 这个函数实现 2个标记文本,以解决配置中的秘密问题;envenvf

    :es-dev {:type:es, :host #env TARGET_HOST, :port9200}
    :psql-prod {:type:sql, :url #envf ["jdbc:postgresql://psq-prod/prod?user=%s&password=%s" PROD_USER PROD_PASSWD]}
    • env 接受一个环境变量的单个 NAME,它在 load-config 调用的结果中放在它的位置。
    • 如果 envf 接受一个数据向量,那么第一个项是传递给clojure函数 format的字符串。 向量中的它的余项是将被查找并随格式字符串传递给 format 调用的环境变量的名称。
    覆盖迁移表

    对于 jdbc/sql migrators,默认情况下迁移表称为 ragtime_migrations。 你可以通过在数据库映射中添加一个名为 :migrations-table的键来更改这个值。

    运行迁移

    joplin.repl 命名空间为of基本操作的每个 5定义了一个函数。 通常使用这些函数来设置一个'迁移和种子替换',你可以通过它控制数据库。

    • migrate [conf env & args]

    在环境中的所有数据库上运行所有挂起的( 向上) 迁移,如果在环境中作为第一个参数提供数据库,则在单个数据库中运行。 这里操作为幂等幂。

    • seed [conf env & args]

    在环境中的所有数据库上运行种子函数,如果在环境中作为第一个参数提供了数据库,则为单个。 这里操作不是幂等的,运行种子函数多次可能导致数据重复。

    Joplin只对已经完全迁移的数据库运行种子功能,换句话说,没有挂起的迁移。

    • rollback [conf env database amount-or-id & args]

    从一个环境中的单个数据库回滚N 迁移( 向下迁移)。 N 可以是数字( 要回滚的迁移步骤数,或者要回滚到的迁移的id )。 这里命令要求你指定一个数据库。

    • reset [conf env database & args]

    回滚所有迁移,应用所有迁移,并在环境中为单个数据库调用种子函数。 用于将数据库重置为良好状态。 这里命令要求你指定一个数据库。

    请注意,重置只能在所有向下迁移完全清除迁移所采取的操作时正常工作。

    • pending [conf env database & args]

    在环境中打印数据库的挂起迁移。

    • create [conf env database & args]

    为环境中的单个数据库创建新的迁移脚手架文件。 这里命令要求你同时指定迁移的数据库和标识字符串。

    从 命令行 运行迁移

    当你想编写迁移的脚本时,需要REPL是不方便的。 在这种情况下,你可以使用Leiningen别名为上面的5操作提供命令行命令。 示例项目演示了在 project.clj 和别名使用的代码中执行这里操作。

    迁移冲突策略

    joplin.repl 函数的额外 ARGS 用于将额外的选项传递给 with,这当前用于指定不同策略的migrate 操作。

    (migrate config :dev :cass-dev {:strategy ragtime.strategy/rebase})

    在这里阅读关于可用性策略的信息。

    写入 migrators

    Joplin migrators默认值为'代码驱动'。 它们是基本的Clojure文件,允许migrators像需要那样简单或者复杂。 如果使用SQL数据库,则可以使用第二种风格的migrators ;ragtime风格的SQL migrators。

    默认 migrators

    移植程序由单个clojure源文件组成。 这个文件必须包含( 至少) 2函数定义,一个叫做 up,一个叫做 down。 这个migrators将用一个参数调用,这是由joplin插件创建的Ragtime数据存储记录。 这些记录将包含与数据库建立连接所需的信息,并产生更改。

    移植的示例;

    $ ls -1 migrators/cass20140717174605_users.clj
    $ cat migrators/cass/20140717174605_users.clj
    (nsmigrators.cass.20140717174605-users (:use [joplin.cassandra.database])
     (:require [clojurewerkz.cassaforte.cql :as cql]
     [clojurewerkz.cassaforte.query :as cq]))
    (defnup [db]
     (let [conn (get-connection (:hosts db) (:keyspace db))]
     (cql/create-table conn "users" (cq/column-definitions {:id:varchar:email:varchar:primary-key [:id]}))))
    (defndown [db]
     (let [conn (get-connection (:hosts db) (:keyspace db))]
     (cql/drop-table conn "users")))

    阅读对应joplin插件的project.clj 文件,查看在migrators中可以使用哪些clojure数据库库。

    SQL migrators

    在迁移SQL数据库时,你可以使用 2种 migrators。 你可以使用两个文本文件(,one ) 指定迁移,如下所示:

    $ ls -1 migrators/sql
    20120903221323-add-test-table.down.sql
    20120903221323-add-test-table.up.sql
    $ cat migrators/sql/20120903221323-add-test-table.up.sql
    CREATE TABLE test_table (id INT);

    对于这种类型的迁移,使用Joplin数据库类型 :sql

    你还可以使用Joplin数据库类型 :jdbc 将迁移指定为Clojure名称空间,例如上面的Cassandra示例。 有关详细信息,请参见示例项目

    如果你在单个文件中有多个sql语句,请注意,你需要在它们之间插入标记 --;;

    编写种子函数

    种子函数总是放在clojure源文件中。 源文件可以包含任意数量的函数,因为种子定义是引用函数的clojure变量的NAME。

    seed函数使用目标映射( 请参见下面) 作为第一个参数调用,并将传递到lein插件调用( 或者以编程方式调用多方法) 中的任何附加参数作为参数。

    种子函数的示例;

    (nsseeds.dt (:require [datomic.api :as d]))
    (defnrun [target & args]
     (let [conn (d/connect (-> target :db:url))]
     @(d/transact conn [{:db/id #db/id [:db.part/user-100]
     :foobar/id42}])))

    目标映射将由 3个键组成;:db, :migrator, :seed。 这些键的内容将是joplin定义中环境图中指定键的( 向上查找) 值。

    从你的代码中调用 Joplin

    从代码调用joplin需要加载 joplin.core 命名空间以及你打算使用的数据库插件的名称空间。 然后你可以调用 5多个方法之一,以执行与leiningen插件部分中所述相同的5操作。 多种方法;joplin.core/migrate-dbjoplin.core/rollback-dbjoplin.core/seed-dbjoplin.core/pending-migrationsjoplin.core/create-migration

    所有方法都采用 target 映射作为它的第一个参数和其他可选参数。

    目标贴图必须具有这里形状;

    {:db {:type DB-TYPE, DB-SETTING1: "foo", :DB-SETTING2:"bar",.. .}
     :migrator"path to a folder on the classpath":seed"name of a var in a namespace on the classpath" }

    :migrator 和/或者 :seed 键是可选的( 如果两者都缺失的话,joplin就不能做太多)。 对于不同的数据库类型,:DB-SETTING 键的不同。

    例如;

    (nsexample (:require [joplin.core :as joplin]
     [joplin.dt.database]))
    (joplin/migrate-db {:db {:type:dt,
     :url"datomic:mem://test"}
     :migrator"joplin/migrators/datomic":seed"seeds.dt/run"})

    提供了数据库类型和它们各自的插件;

    {:db {:type。: 需要 [? ]?
    :jdbcjoplin.jdbc.database
    :sqljoplin.jdbc.database
    :esjoplin.elasticsearch.database
    :zkjoplin.zookeeper.database
    :dtjoplin.dt.database
    :cassjoplin.cassandra.database
    :发电机joplin.dynamodb.database

    注意,扩展joplin处理更多的数据库类型,从而引入更有效的数据库类型是很容易的。

    黑客

    Joplin使用 lein插件插件,这使得在本地安装所有项目变得容易。

    文档

    维基服务

    许可证

    版权所有 © 2015 Martin Trojer

    在 Eclipse public 许可以证下分发版本 1.0版本或者( 按你的选择) 版本任何版本。


    数据  proj  Projects  Clojure  FLEX  SEED  
    相关文章