Migratus:java.lang.Character无法强制转换为clojure.lang.Named

时间:2016-04-20 04:41:31

标签: sqlite clojure database-migration

编辑2

Yogthos昨天推出了Migratus 0.8.14,这看起来已经解决了jdbc API的变化问题。但它还没有出现在Clojars上。一旦我弄清楚如何构建新版本并将其放在我的类路径中,我将向后报告。

修改

也许这与clojure.java.jdbc 0.6.0中的重大变化有关,现在除其他外,需要

(clojure.java.jdbc/create-table-ddl 
  :bar 
  [[:id :serial "primary key"] ; a vector rather than multiple arities
   [:name :text]])

而不是

(clojure.java.jdbc/create-table-ddl
  :bar
  [:id :serial "primary key"]
  [:name :text])

只是一个想法。

我正在尝试跟随https://github.com/yogthos/migratus的示例,但是使用SQLite [编辑:与postgresql相同的问题]。相关文件是这样的:

├── project.clj
├── resources
│   └── migrations
│       ├── 20160419231827-foo.down.sql
│       └── 20160419231827-foo.up.sql
├── src
│   └── foo
│       ├── core.clj
│       └── my-migrations.clj

project.clj是这样的:

(defproject foo "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.8.0"]
                 [migratus "0.8.13"]
                 [org.clojure/java.jdbc "0.6.0-alpha2"]
                 [org.xerial/sqlite-jdbc "3.8.11.2"]
                 [org.slf4j/slf4j-log4j12 "1.7.9"]]
  :main ^:skip-aot foo.core
  :target-path "target/%s"
  :profiles {:uberjar {:aot :all}})

my-migrations.clj就像这样:

(ns foo.my-migrations
  (:require [migratus.core :as migratus]))

(def config {:store :database
            :migration-dir "migrations/"
            :migration-table-name "foo_bar"
            :db {:classname "org.sqlite.JDBC"
                  :subprotocol "sqlite"
                  :connection-uri "jdbc:sqlite:site.db"}})

(migratus/migrate config)

迁移文件逐字记录在文档中(文件名已更新为当前日期/时间)。这会导致以下错误:

  Show: Clojure Java REPL Tooling Duplicates All  (12 frames hidden)

1. Unhandled java.lang.ClassCastException
  java.lang.Character cannot be cast to clojure.lang.Named

                  core.clj: 1546  clojure.core/name
                  core.clj: 1540  clojure.core/name
                  jdbc.clj:   62  clojure.java.jdbc/as-sql-name
                  jdbc.clj:   51  clojure.java.jdbc/as-sql-name
                  jdbc.clj: 1090  clojure.java.jdbc/create-table-ddl/spec-to-string
                  core.clj: 2644  clojure.core/map/fn
              LazySeq.java:   40  clojure.lang.LazySeq/sval
              LazySeq.java:   49  clojure.lang.LazySeq/seq
              LazySeq.java:   71  clojure.lang.LazySeq/first
                  RT.java:  667  clojure.lang.RT/first
                  core.clj:   55  clojure.core/first
                string.clj:  180  clojure.string/join
                string.clj:  180  clojure.string/join
                  jdbc.clj: 1094  clojure.java.jdbc/create-table-ddl
                  jdbc.clj: 1079  clojure.java.jdbc/create-table-ddl
                  jdbc.clj: 1084  clojure.java.jdbc/create-table-ddl
                  jdbc.clj: 1079  clojure.java.jdbc/create-table-ddl
              database.clj:  227  migratus.database/init-schema!/fn
                  jdbc.clj:  591  clojure.java.jdbc/db-transaction*
                  jdbc.clj:  563  clojure.java.jdbc/db-transaction*
                  jdbc.clj:  576  clojure.java.jdbc/db-transaction*
                  jdbc.clj:  563  clojure.java.jdbc/db-transaction*
              database.clj:  220  migratus.database/init-schema!
              database.clj:  219  migratus.database/init-schema!
              database.clj:  262  migratus.database.Database/connect
                  core.clj:   24  migratus.core/run
                  core.clj:   21  migratus.core/run
                  core.clj:   63  migratus.core/migrate
                  core.clj:   60  migratus.core/migrate
                      REPL:   11  foo.my-migrations/eval21297
                      REPL:   11  foo.my-migrations/eval21297
            Compiler.java: 6927  clojure.lang.Compiler/eval
            Compiler.java: 6890  clojure.lang.Compiler/eval
                  core.clj: 3105  clojure.core/eval
                  core.clj: 3101  clojure.core/eval
                  main.clj:  240  clojure.main/repl/read-eval-print/fn
                  main.clj:  240  clojure.main/repl/read-eval-print
                  main.clj:  258  clojure.main/repl/fn
                  main.clj:  258  clojure.main/repl
                  main.clj:  174  clojure.main/repl
              RestFn.java: 1523  clojure.lang.RestFn/invoke
    interruptible_eval.clj:   87  clojure.tools.nrepl.middleware.interruptible-eval/evaluate/fn
                  AFn.java:  152  clojure.lang.AFn/applyToHelper
                  AFn.java:  144  clojure.lang.AFn/applyTo
                  core.clj:  646  clojure.core/apply
                  core.clj: 1881  clojure.core/with-bindings*
                  core.clj: 1881  clojure.core/with-bindings*
              RestFn.java:  425  clojure.lang.RestFn/invoke
    interruptible_eval.clj:   85  clojure.tools.nrepl.middleware.interruptible-eval/evaluate
    interruptible_eval.clj:   55  clojure.tools.nrepl.middleware.interruptible-eval/evaluate
    interruptible_eval.clj:  222  clojure.tools.nrepl.middleware.interruptible-eval/interruptible-eval/fn/fn
    interruptible_eval.clj:  190  clojure.tools.nrepl.middleware.interruptible-eval/run-next/fn
                  AFn.java:   22  clojure.lang.AFn/run
  ThreadPoolExecutor.java: 1142  java.util.concurrent.ThreadPoolExecutor/runWorker
  ThreadPoolExecutor.java:  617  java.util.concurrent.ThreadPoolExecutor$Worker/run
              Thread.java:  745  java.lang.Thread/run

1 个答案:

答案 0 :(得分:0)

最终编辑(我希望):

Migratus版本0.8.14现在在Clojars上。

这是因为clojure.java.jdbc版本0.6.0中的更改。 API已更改为要求create-table-ddl将表规范包装在单个向量中而不是多个arity中。 Yogthos昨天用版本0.8.13→0.8.14修复了这个问题,见here。 Clojars没有Migratus版本0.8.14(而Migratus自述文件仍然有0.8.13)。所以我做了

$> git clone https://github.com/yogthos/migratus
$> cd migratus
$> lein install

现在可行。