Clojure:将 ragtime 与 sqlite3 一起使用

Posted

技术标签:

【中文标题】Clojure:将 ragtime 与 sqlite3 一起使用【英文标题】:Clojure: using ragtime with sqlite3 【发布时间】:2016-05-20 11:15:56 【问题描述】:

我想使用ragtime 来管理 SQLite 数据库上的迁移。在instructions here 之后,我在 REPL 中尝试了以下内容:

(require '[ragtime.jdbc :as jdbc]
         '[ragtime.repl :as repl])

(def config
     :datastore  (jdbc/sql-database :connection-uri "jdbc:sqlite:resources/db.sqlite3")
      :migrations (jdbc/load-resources "migrations"))

(repl/migrate config)

我得到的只是以下错误:

ClassCastException clojure.lang.PersistentVector cannot be cast to clojure.lang.Named  clojure.core/name (core.clj:1546)

数据库文件存在于resources/db.sqlite3。我已经尝试跟踪异常(如果需要,我可以添加堆栈跟踪),但它似乎发生在 clojure.java.jdbc 深处。

由于我是 JVM 和 JDBC 新手,我也不确定我是否正确指定了 :connection-uri;我尝试了几种变体,但似乎无法正常工作。

任何帮助将不胜感激!


编辑:堆栈跟踪:

java.lang.ClassCastException: clojure.lang.PersistentVector cannot be cast to clojure.lang.Named
 at clojure.core$name.invokeStatic (core.clj:1546)
    clojure.core$name.invoke (core.clj:1540)
    clojure.java.jdbc$as_sql_name.invokeStatic (jdbc.clj:67)
    clojure.java.jdbc$as_sql_name.invoke (jdbc.clj:56)
    clojure.java.jdbc$create_table_ddl$spec_to_string__2511.invoke (jdbc.clj:1052)
    clojure.core$map$fn__4785.invoke (core.clj:2646)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.LazySeq.first (LazySeq.java:71)
    clojure.lang.RT.first (RT.java:667)
    clojure.core$first__4339.invokeStatic (core.clj:55)
    clojure.string$join.invokeStatic (string.clj:180)
    clojure.string$join.invoke (string.clj:180)
    clojure.java.jdbc$create_table_ddl.invokeStatic (jdbc.clj:1056)
    clojure.java.jdbc$create_table_ddl.doInvoke (jdbc.clj:1041)
    clojure.lang.RestFn.invoke (RestFn.java:423)
    ragtime.jdbc$migrations_table_ddl.invokeStatic (jdbc.clj:16)
    ragtime.jdbc$migrations_table_ddl.invoke (jdbc.clj:15)
    ragtime.jdbc$ensure_migrations_table_exists.invokeStatic (jdbc.clj:22)
    ragtime.jdbc$ensure_migrations_table_exists.invoke (jdbc.clj:20)
    ragtime.jdbc.SqlDatabase.applied_migration_ids (jdbc.clj:42)
    ragtime.core$migrate_all.invokeStatic (core.clj:43)
    ragtime.core$migrate_all.invoke (core.clj:32)
    ragtime.repl$migrate.invokeStatic (repl.clj:49)
    ragtime.repl$migrate.invoke (repl.clj:34)
    thulium.core$eval8407.invokeStatic (form-init2686611279014890656.clj:1)
    (the rest is REPL and compiler calls)

还有两个迁移文件,resources/migrations/001-initial.up.sql

CREATE TABLE tests (
  id INTEGER PRIMARY KEY AUTOINCREMENT
);

resources/migrations/001-initial.down.sql:

DROP TABLE tests;

【问题讨论】:

完整的堆栈跟踪可能有助于跟踪这一点。此外,您可能需要一个指向 sqlite 数据库的绝对路径。 我还建议您发布迁移文件的内容。 为数据库提供绝对路径会产生完全相同的错误。 【参考方案1】:

试试这些版本:

[org.clojure/java.jdbc "0.6.1"]
[org.xerial/sqlite-jdbc "3.8.7"]

【讨论】:

以上是关于Clojure:将 ragtime 与 sqlite3 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

安卓应用版本升级时sqlit数据库升级

Python与sqlit数据库--简单介绍

Clojure 与 Numpy 中的矩阵乘法

Clojure 的代理与 Scala 的演员相比如何?

我可以将 Clojure 表单从一个包转换为另一个包吗?

Sqlit--学习教程(命令)