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 一起使用的主要内容,如果未能解决你的问题,请参考以下文章