在 Clojure 中,如何配置 Korma 和 Ragtime 以使用相同的数据库?

Posted

技术标签:

【中文标题】在 Clojure 中,如何配置 Korma 和 Ragtime 以使用相同的数据库?【英文标题】:In Clojure, how do I configure Korma and Ragtime to use the same database? 【发布时间】:2014-10-24 06:35:42 【问题描述】:

我正在尝试使用 Clojure 中的数据库。此时我想使用Ragtime修改数据库架构本身,Korma查询和插入数据,H2作为实际数据库。

我认为我正确地使用了它们,但是当我尝试使用 Korma 访问表时出现错误。

这是我的 project.clj:

(defproject dbexplore "0.1.0-SNAPSHOT"
  :dependencies [[org.clojure/clojure "1.6.0"]
                 [korma "0.4.0"]
                 [com.h2database/h2 "1.4.182"]
                 [ragtime "0.3.7"]]
  :plugins [[ragtime/ragtime.lein "0.3.7"]]
  :ragtime :migrations ragtime.sql.files/migrations
            :database "jdbc:h2:/home/zck/Documents/dbexplore/resources/db/dbexplore.db"
  :main dbexplore.core)

所以我要导入 korma、h2database 和 ragtime。我不确定它是否将 Ragtime 迁移指向正确的数据库位置。

我创建了一个迁移文件,内容如下:

create table users (id INT, first varchar(32), last varchar(32));

然后运行它:

zck@zck-desktop:~/Documents/dbexplore$ lein ragtime migrate
Applying 2014-10-22-2-11-create-tables

我制作了一个简单的 core.clj 文件,它只从用户表中选择所有内容:

(ns dbexplore.core
  (:require [korma.db :as db]
            [korma.core]))

(def db-connection (db/h2 :db "./resources/db/dbexplore.db"))

(db/defdb korma-db db-connection)

(korma.core/defentity users)

(defn -main []
  (korma.core/select users))

但是在使用lein run 运行它时,我得到一个错误:

Failure to execute query with SQL:
SELECT "users".* FROM "users"  ::  []
JdbcSQLException:
 Message: Table "users" not found; SQL statement:
SELECT "users".* FROM "users" [42102-182]
 SQLState: 42S02
 Error Code: 42102
Exception in thread "main" org.h2.jdbc.JdbcSQLException: Table "users" not found; SQL statement:
SELECT "users".* FROM "users" [42102-182], compiling:(/tmp/form-init7833348906040195763.clj:1:90)

我的怀疑是我在 core.clj 中的h2 调用中指向另一个数据库文件,来自一个 ragtime 正在迁移,但我不确定如何正确指定它。如何让这两个库使用同一个数据库?

【问题讨论】:

您好,您找到解决方案了吗?我遇到了同样的问题,我通过一些不同的 sql 客户端确保该表存在。 @sveri 我没有,所以我停止尝试。我已经(暂时)放弃了尝试将数据库与 Clojure 一起使用。 【参考方案1】:

我在 korma 中创建了一个问题:https://github.com/korma/Korma/issues/273 也许你想添加一些东西。

我能够使用 yesql 而不是 korma 从 h2 数据库中读取数据。根据不同的线程应该可以用mysql或者postgresql代替h2,但是我没试过。

顺便说一句。我已经成功地将 datomic 用于我的最后一个副项目,没有任何这些问题,所以不要放弃,尝试不同的设置。

更新请查看链接的错误,维护者发布了两个解决方案,它们都对我有用。

【讨论】:

以上是关于在 Clojure 中,如何配置 Korma 和 Ragtime 以使用相同的数据库?的主要内容,如果未能解决你的问题,请参考以下文章

使用 clojure 的 korma sqlite3 助手时,sqlite3 数据库的默认路径是啥?

Clojure线程优先具有过滤功能

如何使用 korma 在 postgresql 上插入 clj-time 日期时间对象

如何在 Clojure 中递归展平任意嵌套的向量和映射?

如何做批处理 jdbc/insert!和 jdbc/更新!在 Clojure 中使用 postgresql?

clojure 中的惯用配置管理?