'Error "No such namespace: jdbc" when requiring next.jdbc in Clojure
I'm running into require and or next.jdbc errors when I attempt to create a postgres database:
Unhandled java.io.FileNotFoundException
Could not locate next/jdbc__init.class, next/jdbc.clj or next/jdbc.cljc on
classpath.
and the following. Which appears anytime I attempt to call jdbc functions within the cljblog.db namespace.
1. Caused by java.lang.RuntimeException
No such namespace: jdbc
Here's my db setup:
(ns cljblog.db)
(require '[next.jdbc :as jdbc])
(def db
{:dbtype "postgresql"
:dbname "cljblog"
:host "localhost"
:user "postgres"
:password "postgres"})
(def ds (jdbc/get-datasource db))
(def ds (jdbc/get-datasource db))
(def conn (jdbc/get-connection ds))
(jdbc/execute! conn ["
-- postgresql version
drop table if exists posts?;
create table posts (
id int,
title varchar(255),
body text,
author varchar(25)
"])
(jdbc/execute! conn ["
insert into posts(title,body,author)
values('Working with postgres',
'this is my first attempt at working
with postgres in Clojure', 'Sam Dees')"])
(def result-set
(jdbc/execute!
conn
["select * from posts"]))
and the project.clj
(defproject cljblog "0.1.0-SNAPSHOT"
:description "FIXME: write description"
:url "http://example.com/FIXME"
:min-lein-version "2.0.0"
:dependencies [[org.clojure/clojure "1.10.0"]
[compojure "1.6.1"]
[ring/ring-defaults "0.3.2"]
[hiccup "1.0.5"]
[com.github.seancorfield/next.jdbc "1.2.780"]
[org.postgresql/postgresql "9.4-1201-jdbc41"]]
:plugins [[lein-ring "0.12.5"]]
:ring {:handler cljblog.handler/app}
:repl-options {:init-ns clj-jdbc.core}
:profiles
{:dev {:dependencies [[javax.servlet/servlet-api "2.5"]
[ring/ring-mock "0.3.2"]]}})
*I've truncated the full error messages for brevity. *postgres is installed with an active server running on the system
Solution 1:[1]
Assuming you restarted your REPL after adding those dependencies, your ns form should look like this:
(ns cljblog.db
(:require [next.jdbc :as jdbc]))
In addition, you have:
:repl-options {:init-ns clj-jdbc.core}
but you didn't show us that namespace (in the file src/clj_jdbc/core.clj) which I suspect is where the error is really occurring.
Solution 2:[2]
You may wish to clone this demo project using Postgres in a Docker container along with next.jdbc for access:
https://github.com/cloojure/demo-jdbc-next
Follow along the instructions from the README and it should work right away. There are also examples of using next.jdbc with the H2 database.
When you run the tests, you will see everything working:
> lein clean; lein test
lein test _bootstrap
-------------------------------
Clojure 1.10.3 Java 17
-------------------------------
lein test tst.demo.jdbc-h2
lein test tst.demo.jdbc-postgres
Ran 7 tests containing 42 assertions.
0 failures, 0 errors.
All of the action is in the test namespaces. The file test/tst/demo/jdbc_postgres.clj starts out like so:
(ns tst.demo.jdbc-postgres
(:use demo.core tupelo.core tupelo.test)
(:require
[next.jdbc :as jdbc]
[next.jdbc.result-set :as rs]
[next.jdbc.sql :as sql]
))
; ***** change this value to `false` to disable PostgreSQL unit tests *****
(def postgres-enable true)
;---------------------------------------------------------------------------------------------------
(when postgres-enable
(def db-info {:dbtype "postgres"
:dbname "example"
:user "postgres"
:password "docker"
})
(def ds (jdbc/get-datasource db-info))
; NOTE: ***** Must MANUALLY create DB 'example' before run this test! *****
; In PSQL, do `create database example;`. See the README.
(dotest
(jdbc/execute! ds ["drop table if exists address"])
(let [r11 (jdbc/execute! ds ["
create table address (
id serial primary key,
name varchar(32),
email varchar(255)
) "])
r12 (jdbc/execute! ds ["
insert into address(name, email)
values( 'Homer Simpson', '[email protected]' ) "])
r13 (jdbc/execute! ds ["select * from address "])
]
(is= r11 [#:next.jdbc{:update-count 0}])
(is= r12 [#:next.jdbc{:update-count 1}])
(is= r13 [#:address{:id 1, :name "Homer Simpson", :email "[email protected]"}]))
<snip>
I've noticed that you seem to have something wrong in your project.clj. Mine looks like:
:dependencies [
[com.h2database/h2 "1.4.200"] ; #todo cannot upgrade yet or crash!
[hikari-cp "2.14.0"]
[org.clojure/clojure "1.11.1"]
[org.clojure/test.check "1.1.1"]
[org.postgresql/postgresql "42.3.5"]
[prismatic/schema "1.2.1"]
[com.github.seancorfield/next.jdbc "1.2.780"]
[tupelo "22.05.20"]
]
so the dependency on org.postgresql/postgresql may be part of the problem.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Sean Corfield |
| Solution 2 |
