weavejester / ragtime

Database-independent migration library
Eclipse Public License 1.0
608 stars 85 forks source link

error trying to migrate in postgres #120

Open ashton opened 6 years ago

ashton commented 6 years ago

I'm trying to make a migration in postgres, I'm following the getting started and using the integreation with leiningen:

{:aliases {"migrate"  ["run" "-m" "investtrack.scripts.migration/migrate"]
            "rollback" ["run" "-m" "investtrack.scripts.migration/rollback"]}}
(ns investtrack.scripts.migration
  (:require [ragtime.jdbc :as jdbc]
            [ragtime.repl :as repl]))

(defn load-config []
  {:datastore  (jdbc/sql-database "jdbc:postgresql://postgres@localhost/investtrack")
   :migrations (jdbc/load-resources "migrations")})

(defn migrate []
  (repl/migrate (load-config)))

(defn rollback []
  (repl/rollback (load-config)))

Runing the command: $ lein migrate I get the following error:

Caused by: java.lang.ClassCastException: clojure.lang.PersistentVector cannot be cast to clojure.lang.Named at clojure.core$name.invokeStatic(core.clj:1546) at clojure.core$name.invoke(core.clj:1540) at clojure.java.jdbc$as_sql_name.invokeStatic(jdbc.clj:67) at clojure.java.jdbc$as_sql_name.invoke(jdbc.clj:56) at clojure.java.jdbc$create_table_ddl$spec_to_string449.invoke(jdbc.clj:1052) at clojure.core$map$fn4785.invoke(core.clj:2646) at clojure.lang.LazySeq.sval(LazySeq.java:40) at clojure.lang.LazySeq.seq(LazySeq.java:49) at clojure.lang.LazySeq.first(LazySeq.java:71) at clojure.lang.RT.first(RT.java:667) at clojure.core$first__4339.invokeStatic(core.clj:55) at clojure.string$join.invokeStatic(string.clj:180) at clojure.string$join.invoke(string.clj:180) at clojure.java.jdbc$create_table_ddl.invokeStatic(jdbc.clj:1056) at clojure.java.jdbc$create_table_ddl.doInvoke(jdbc.clj:1041) at clojure.lang.RestFn.invoke(RestFn.java:423) at ragtime.jdbc$migrations_table_ddl.invokeStatic(jdbc.clj:15) at ragtime.jdbc$migrations_table_ddl.invoke(jdbc.clj:14) at ragtime.jdbc$ensure_migrations_table_exists.invokeStatic(jdbc.clj:43) at ragtime.jdbc$ensure_migrations_table_exists.invoke(jdbc.clj:41) at ragtime.jdbc.SqlDatabase.applied_migration_ids(jdbc.clj:62) at ragtime.core$migrate_all.invokeStatic(core.clj:57) at ragtime.core$migrate_all.invoke(core.clj:33) at ragtime.repl$migrate.invokeStatic(repl.clj:32) at ragtime.repl$migrate.invoke(repl.clj:17) at investtrack.scripts.migration$migrate.invokeStatic(migration.clj:10) at investtrack.scripts.migration$migrate.invoke(migration.clj:9) at clojure.lang.Var.invoke(Var.java:375) at user$eval5.invokeStatic(form-init4999925638129078061.clj:1) at user$eval5.invoke(form-init4999925638129078061.clj:1) at clojure.lang.Compiler.eval(Compiler.java:6927) at clojure.lang.Compiler.eval(Compiler.java:6917) at clojure.lang.Compiler.load(Compiler.java:7379)

weavejester commented 6 years ago

Try changing your load-config function to:

(defn load-config []
  {:datastore  (jdbc/sql-database {:connection-uri "jdbc:postgresql://postgres@localhost/investtrack"})
   :migrations (jdbc/load-resources "migrations")})
ashton commented 6 years ago

changed to:

(defn load-config []
  {:datastore  (jdbc/sql-database {:connection-uri "jdbc:postgresql://localhost/investtrack?user=postgres"})
   :migrations (jdbc/load-resources "migrations")})

because the URI with user@host wasn't working, but I got the same error:

Exception in thread "main" java.lang.ClassCastException: clojure.lang.PersistentVector cannot be cast to clojure.lang.Named, compiling:(/private/var/folders/r7/0y3zp5r513v7_j7g1qshvyg00000gn/T/form-init8552361286008879301.clj:1:125) at clojure.lang.Compiler.load(Compiler.java:7391) at clojure.lang.Compiler.loadFile(Compiler.java:7317) at clojure.main$load_script.invokeStatic(main.clj:275) at clojure.main$init_opt.invokeStatic(main.clj:277) at clojure.main$init_opt.invoke(main.clj:277) at clojure.main$initialize.invokeStatic(main.clj:308) at clojure.main$null_opt.invokeStatic(main.clj:342) at clojure.main$null_opt.invoke(main.clj:339) at clojure.main$main.invokeStatic(main.clj:421) at clojure.main$main.doInvoke(main.clj:384) at clojure.lang.RestFn.invoke(RestFn.java:421) at clojure.lang.Var.invoke(Var.java:383) at clojure.lang.AFn.applyToHelper(AFn.java:156) at clojure.lang.Var.applyTo(Var.java:700) at clojure.main.main(main.java:37) Caused by: java.lang.ClassCastException: clojure.lang.PersistentVector cannot be cast to clojure.lang.Named at clojure.core$name.invokeStatic(core.clj:1546) at clojure.core$name.invoke(core.clj:1540) at clojure.java.jdbc$as_sql_name.invokeStatic(jdbc.clj:67) at clojure.java.jdbc$as_sql_name.invoke(jdbc.clj:56) at clojure.java.jdbc$create_table_ddl$spec_to_string449.invoke(jdbc.clj:1052) at clojure.core$map$fn4785.invoke(core.clj:2646) at clojure.lang.LazySeq.sval(LazySeq.java:40) at clojure.lang.LazySeq.seq(LazySeq.java:49) at clojure.lang.LazySeq.first(LazySeq.java:71) at clojure.lang.RT.first(RT.java:667) at clojure.core$first__4339.invokeStatic(core.clj:55) at clojure.string$join.invokeStatic(string.clj:180) at clojure.string$join.invoke(string.clj:180) at clojure.java.jdbc$create_table_ddl.invokeStatic(jdbc.clj:1056) at clojure.java.jdbc$create_table_ddl.doInvoke(jdbc.clj:1041) at clojure.lang.RestFn.invoke(RestFn.java:423) at ragtime.jdbc$migrations_table_ddl.invokeStatic(jdbc.clj:15) at ragtime.jdbc$migrations_table_ddl.invoke(jdbc.clj:14) at ragtime.jdbc$ensure_migrations_table_exists.invokeStatic(jdbc.clj:43) at ragtime.jdbc$ensure_migrations_table_exists.invoke(jdbc.clj:41) at ragtime.jdbc.SqlDatabase.applied_migration_ids(jdbc.clj:62) at ragtime.core$migrate_all.invokeStatic(core.clj:57) at ragtime.core$migrate_all.invoke(core.clj:33) at ragtime.repl$migrate.invokeStatic(repl.clj:32) at ragtime.repl$migrate.invoke(repl.clj:17) at investtrack.scripts.migration$migrate.invokeStatic(migration.clj:10) at investtrack.scripts.migration$migrate.invoke(migration.clj:9) at clojure.lang.Var.invoke(Var.java:375) at user$eval5.invokeStatic(form-init8552361286008879301.clj:1) at user$eval5.invoke(form-init8552361286008879301.clj:1) at clojure.lang.Compiler.eval(Compiler.java:6927) at clojure.lang.Compiler.eval(Compiler.java:6917) at clojure.lang.Compiler.load(Compiler.java:7379) ... 14 more

weavejester commented 6 years ago

Could you run lein deps :tree on your repository? Perhaps there's a dependency issue.

If there's no problems with the dependencies, can you create a small project that replicates this error?

ashton commented 6 years ago

Here is the dependency tree:

Possibly confusing dependencies found:
[korma "0.4.0"] -> [org.clojure/java.jdbc "0.3.5"]
 overrides
[ragtime "0.7.2"] -> [ragtime/jdbc "0.7.2"] -> [org.clojure/java.jdbc "0.5.8"]

Consider using these exclusions:
[ragtime "0.7.2" :exclusions [org.clojure/java.jdbc]]

 [cider/cider-nrepl "0.14.0"]
   [org.tcrawley/dynapath "0.2.4" :exclusions [[org.clojure/clojure]]]
 [clj-time "0.14.0"]
   [joda-time "2.9.7"]
 [clojure-complete "0.2.4" :exclusions [[org.clojure/clojure]]]
 [compojure "1.5.1"]
   [clout "2.1.2"]
     [instaparse "1.4.0" :exclusions [[org.clojure/clojure]]]
   [medley "0.8.2"]
   [org.clojure/tools.macro "0.1.5"]
   [ring/ring-codec "1.0.1"]
     [commons-codec "1.6"]
   [ring/ring-core "1.5.0"]
     [commons-fileupload "1.3.1"]
     [commons-io "2.5"]
     [crypto-equality "1.0.0"]
     [crypto-random "1.2.0"]
     [org.clojure/tools.reader "0.9.1"]
 [http-kit "2.1.16"]
 [javax.servlet/servlet-api "2.5" :scope "test"]
 [korma "0.4.0"]
   [c3p0 "0.9.1.2"]
   [org.clojure/java.jdbc "0.3.5"]
 [org.clojure/clojure "1.8.0"]
 [org.clojure/tools.nrepl "0.2.13"]
 [org.postgresql/postgresql "9.2-1002-jdbc4"]
 [pjstadig/humane-test-output "0.8.3" :scope "test"]
 [ragtime "0.7.2"]
   [ragtime/core "0.7.2"]
   [ragtime/jdbc "0.7.2"]
     [resauce "0.1.0"]
 [ring/ring-defaults "0.2.1"]
   [ring/ring-anti-forgery "1.0.1"]
     [hiccup "1.0.5"]
   [ring/ring-headers "0.2.0"]
   [ring/ring-ssl "0.2.1"]
 [ring/ring-json "0.4.0"]
   [cheshire "5.5.0"]
     [com.fasterxml.jackson.core/jackson-core "2.5.3"]
     [com.fasterxml.jackson.dataformat/jackson-dataformat-cbor "2.5.3"]
     [com.fasterxml.jackson.dataformat/jackson-dataformat-smile "2.5.3"]
     [tigris "0.1.1"]
 [ring/ring-mock "0.3.0" :scope "test"]
weavejester commented 6 years ago

There's a dependency warning:

Possibly confusing dependencies found:
[korma "0.4.0"] -> [org.clojure/java.jdbc "0.3.5"]
 overrides
[ragtime "0.7.2"] -> [ragtime/jdbc "0.7.2"] -> [org.clojure/java.jdbc "0.5.8"]

Korma is forcing an older version of java.jdbc to be used. Try adding in an explicit dependency to your project file:

[org.clojure/java.jdbc "0.5.8"]
albertchan commented 5 years ago

I'm also getting an error when trying to migrate with Postgres but the issue is different from Ashton's.

The error I'm getting with running lein migrate is:

Exception in thread "main" Syntax error compiling at (/private/var/folders/2c/1xhskbj17xb0gcx7j9kfxq740000gn/T/form-init5968680565182525726.clj:1:125).
    at clojure.lang.Compiler.load(Compiler.java:7647)
    at clojure.lang.Compiler.loadFile(Compiler.java:7573)
    at clojure.main$load_script.invokeStatic(main.clj:452)
    at clojure.main$init_opt.invokeStatic(main.clj:454)
    at clojure.main$init_opt.invoke(main.clj:454)
    at clojure.main$initialize.invokeStatic(main.clj:485)
    at clojure.main$null_opt.invokeStatic(main.clj:519)
    at clojure.main$null_opt.invoke(main.clj:516)
    at clojure.main$main.invokeStatic(main.clj:598)
    at clojure.main$main.doInvoke(main.clj:561)
    at clojure.lang.RestFn.applyTo(RestFn.java:137)
    at clojure.lang.Var.applyTo(Var.java:705)
    at clojure.main.main(main.java:37)
Caused by: org.postgresql.util.PSQLException: This ResultSet is closed.
    at org.postgresql.jdbc2.AbstractJdbc2ResultSet.checkClosed(AbstractJdbc2ResultSet.java:2852)
    at org.postgresql.jdbc2.AbstractJdbc2ResultSet.setFetchSize(AbstractJdbc2ResultSet.java:1875)
    at org.postgresql.jdbc4.Jdbc4Statement.createResultSet(Jdbc4Statement.java:37)
    at org.postgresql.jdbc2.AbstractJdbc2Statement$StatementResultHandler.handleResultRows(AbstractJdbc2Statement.java:221)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1853)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:561)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:405)
    at org.postgresql.jdbc2.AbstractJdbc2Connection.execSQLUpdate(AbstractJdbc2Connection.java:382)
    at org.postgresql.jdbc2.AbstractJdbc2Connection.getTransactionIsolation(AbstractJdbc2Connection.java:904)
    at clojure.java.jdbc$db_transaction_STAR_.invokeStatic(jdbc.clj:593)
    at clojure.java.jdbc$db_transaction_STAR_.invoke(jdbc.clj:574)
    at clojure.java.jdbc$db_transaction_STAR_.invokeStatic(jdbc.clj:587)
    at clojure.java.jdbc$db_transaction_STAR_.invoke(jdbc.clj:574)
    at clojure.java.jdbc$db_do_execute_prepared_statement.invokeStatic(jdbc.clj:805)
    at clojure.java.jdbc$db_do_execute_prepared_statement.invoke(jdbc.clj:800)
    at clojure.java.jdbc$db_do_prepared.invokeStatic(jdbc.clj:844)
    at clojure.java.jdbc$db_do_prepared.invoke(jdbc.clj:817)
    at clojure.java.jdbc$execute_BANG_$execute_helper__556.invoke(jdbc.clj:959)
    at clojure.java.jdbc$execute_BANG_.invokeStatic(jdbc.clj:963)
    at clojure.java.jdbc$execute_BANG_.invoke(jdbc.clj:941)
    at clojure.java.jdbc$execute_BANG_.invokeStatic(jdbc.clj:952)
    at clojure.java.jdbc$execute_BANG_.invoke(jdbc.clj:941)
    at ragtime.jdbc$ensure_migrations_table_exists.invokeStatic(jdbc.clj:42)
    at ragtime.jdbc$ensure_migrations_table_exists.invoke(jdbc.clj:40)
    at ragtime.jdbc.SqlDatabase.applied_migration_ids(jdbc.clj:61)
    at ragtime.core$migrate_all.invokeStatic(core.clj:57)
    at ragtime.core$migrate_all.invoke(core.clj:33)
    at ragtime.repl$migrate.invokeStatic(repl.clj:32)
    at ragtime.repl$migrate.invoke(repl.clj:17)
    at scripts.migration$migrate.invokeStatic(migration.clj:18)
    at scripts.migration$migrate.invoke(migration.clj:17)
    at clojure.lang.Var.invoke(Var.java:380)
    at user$eval140.invokeStatic(form-init5968680565182525726.clj:1)
    at user$eval140.invoke(form-init5968680565182525726.clj:1)
    at clojure.lang.Compiler.eval(Compiler.java:7176)
    at clojure.lang.Compiler.eval(Compiler.java:7166)
    at clojure.lang.Compiler.load(Compiler.java:7635)
    ... 12 more

My integration with Leiningen is also similar to Ashton's but my project.clj is:

(defproject clj-admin "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"]
   [http-kit "2.3.0"]
   [postgresql "9.3-1102.jdbc41"]
   [ragtime "0.8.0"]
   [ring/ring-defaults "0.3.2"]]

  :plugins
  [[lein-ring "0.12.5"]]

  :ring {:handler clj-admin.handler/app}

  :profiles
  {:dev {:dependencies [[javax.servlet/servlet-api "2.5"]
                        [ring/ring-mock "0.3.2"]]}}

  :aliases {"migrate"  ["run" "-m" "scripts.migration/migrate"]
            "rollback" ["run" "-m" "scripts.migration/rollback"]})

And my deps tree is:

[clojure-complete "0.2.5" :exclusions [[org.clojure/clojure]]]
 [compojure "1.6.1"]
   [clout "2.2.1"]
     [instaparse "1.4.8" :exclusions [[org.clojure/clojure]]]
   [medley "1.0.0"]
   [org.clojure/tools.macro "0.1.5"]
   [ring/ring-codec "1.1.0"]
     [commons-codec "1.10"]
   [ring/ring-core "1.6.3"]
     [clj-time "0.11.0"]
       [joda-time "2.8.2"]
     [commons-fileupload "1.3.3"]
     [commons-io "2.5"]
     [crypto-equality "1.0.0"]
     [crypto-random "1.2.0"]
 [http-kit "2.3.0"]
 [javax.servlet/servlet-api "2.5" :scope "test"]
 [nrepl "0.6.0" :exclusions [[org.clojure/clojure]]]
 [org.clojure/clojure "1.10.0"]
   [org.clojure/core.specs.alpha "0.2.44"]
   [org.clojure/spec.alpha "0.2.176"]
 [postgresql "9.3-1102.jdbc41"]
 [ragtime "0.8.0"]
   [ragtime/core "0.8.0"]
   [ragtime/jdbc "0.8.0"]
     [org.clojure/java.jdbc "0.5.8"]
     [resauce "0.1.0"]
 [ring/ring-defaults "0.3.2"]
   [javax.servlet/javax.servlet-api "3.1.0"]
   [ring/ring-anti-forgery "1.3.0"]
     [hiccup "1.0.5"]
   [ring/ring-headers "0.3.0"]
   [ring/ring-ssl "0.3.0"]
 [ring/ring-mock "0.3.2" :scope "test"]
   [cheshire "5.8.0" :scope "test"]
     [com.fasterxml.jackson.core/jackson-core "2.9.0" :scope "test"]
     [com.fasterxml.jackson.dataformat/jackson-dataformat-cbor "2.9.0" :scope "test"]
     [com.fasterxml.jackson.dataformat/jackson-dataformat-smile "2.9.0" :scope "test"]
     [tigris "0.1.1" :scope "test"]

Any ideas? Thanks!

leonardiwagner commented 4 years ago

@albertchan I was having the same issue, changing [postgresql "9.3-1102.jdbc41"] for [org.postgresql/postgresql "42.2.5"] dependency solved that.