gpt4 book ai didi

除非使用 Leiningen REPL,否则 Clojure jdbc create-table 语句不会运行

转载 作者:行者123 更新时间:2023-12-02 21:28:03 24 4
gpt4 key购买 nike

我有一个小型 Clojure 程序,它使用 Clojure JDBC在 HSQL 数据库中创建表的工具。然而,如果我从 Leiningen 的 REPL 运行它,它似乎只会实际创建该表。如果我使用 lein run 或从我的 IDE (IntelliJ) 运行代码,它不会创建表。没有报告任何异常情况。在这两种情况下,输出都只是“(0)”。

这是代码片段:

(ns tramway.core
(:require [clojure.java.io :as io]
[clojure.java.jdbc :as sql]))

(def hsql-db {:subprotocol "hsqldb"
:subname "file:/tmp/tramwaydb"
:user "SA"
:password ""})

(defn -main []
(println (sql/with-connection hsql-db (sql/create-table
:footfall
[:id "INTEGER" "GENERATED ALWAYS AS IDENTITY(START WITH 1)"]
[:sample_date "DATE"]
[:exhibition "varchar(255)"]))))

由于我使用的是 Leiningen,所以这是我的 project.clj:

(defproject tramway "1.0.0-SNAPSHOT"
:description "Description here"
:dependencies [[org.clojure/clojure "1.3.0"]
[org.clojure/java.jdbc "0.1.4"]
[org.hsqldb/hsqldb "2.2.8"]]
:main tramway.core)

如果我这样做:

$ lein repl

tramway.core=> (-main)
(0)
nil

然后检查/tmp/tramway.log我可以看到CREATE TABLE执行成功。

但是,如果我这样做:

$ rm -rf /tmp/tramway.*
$ lein run
(0)

然后检查同一个文件,它是空的。它确实创建.log.properties.script文件。除了 .log 文件之外的所有文件都有内容;只是没有运行过CREATE TABLE 的记录。

我做错了什么?无论我从 REPL 运行我的 (-main) 函数还是让 Leiningen 自动运行它,我都希望得到相同的结果。

我还尝试将表创建从 -main 函数中取出,并通过我的 IDE 将其作为脚本运行,但仍然得到相同的错误结果。

最佳答案

这是一个常见的 HSQLDB 配置问题。

HSQLDB 的默认配置不适合测试使用。因此,它会将 .log 条目的写入和同步延迟 500 毫秒,并且在连接关闭时不会关闭数据库。在您的 URL 中尝试以下任一设置:

:subname "file:/tmp/tramwaydb;hsqldb.write_delay=false"

:subname "file:/tmp/tramwaydb;shutdown=true"

在此处查看各种选项:http://hsqldb.org/doc/2.0/guide/dbproperties-chapt.html

关于除非使用 Leiningen REPL,否则 Clojure jdbc create-table 语句不会运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10238399/

24 4 0