imdrasil / jennifer.cr

Crystal ORM using ActiveRecord pattern with flexible query DSL
MIT License
418 stars 55 forks source link

Strange error when I trying make to db:migrate #302

Closed dbachinin closed 4 years ago

dbachinin commented 4 years ago

Hi @imdrasil,

I have in 'src/sam.cr'

require "jennifer"
require "jennifer/adapter/postgres"

require "../config/jennifer"
require "../db/migrations/*"
require "sam"
require "jennifer/sam"
load_dependencies "jennifer"
Sam.help

in 'config/jennifer.cr'

require "amber"
require "colorize"
require "jennifer/adapter/postgres"

Jennifer::Config.read("config/database.yml", Amber.env.to_s)

Jennifer::Config.configure do |conf|
  conf.logger = Logger.new(STDOUT)

  conf.logger.formatter = Logger::Formatter.new do |severity, datetime, progname, message, io|
    io << datetime.colorize(:cyan) << ": \n" << message.colorize(:light_magenta)
  end
  conf.logger.level = Logger::DEBUG
end

And migration in 'db/migration'

class User < Jennifer::Migration::Base
  def up
    create_enum(:role_enum, ["admin", "client", "taxist"])
    create_table(:users) do |t|
      t.string :name, {:size => 30}
      t.string :email
      t.string :phone
      t.integer :provider_id
      t.float :score
      t.string :tags, {:array => true}
      t.field :role, :role_enum
      t.string :hashed_password
      t.timestamps
    end
  end

  def down
    drop_table :users
    drop_enum(:role_enum)
  end
end

Commands crystal src/sam.cr -- db:drop and create are working. But db:migrate it returns an error.

lib/pg/src/pg/connection.cr:16:9 in 'initialize'
lib/pg/src/pg/connection.cr:7:5 in 'new'
lib/pg/src/pg/driver.cr:3:5 in 'build_connection'
lib/db/src/db/database.cr:57:9 in '->'
lib/db/src/db/pool.cr:255:3 in 'build_resource'
lib/db/src/db/pool.cr:45:34 in 'initialize'
lib/db/src/db/pool.cr:38:5 in 'new:initial_pool_size:max_pool_size:max_idle_pool_size:checkout_timeout:retry_attempts:retry_delay'
lib/db/src/db/database.cr:56:15 in 'initialize'
lib/db/src/db/database.cr:49:5 in 'new'
lib/db/src/db.cr:152:5 in 'build_database'
lib/db/src/db.cr:148:5 in 'build_database'
lib/db/src/db.cr:116:5 in 'open'
lib/jennifer/src/jennifer/adapter/base.cr:31:15 in 'initialize'
lib/jennifer/src/jennifer/adapter/base.cr:30:7 in 'new'
lib/jennifer/src/jennifer/adapter/base.cr:35:9 in 'build'
lib/jennifer/src/jennifer/adapter.cr:51:9 in 'adapter'
lib/jennifer/src/jennifer/adapter.cr:62:7 in 'default_adapter'
lib/jennifer/src/jennifer/migration/runner.cr:90:9 in 'default_adapter'
lib/jennifer/src/jennifer/migration/runner.cr:10:9 in 'migrate'
lib/jennifer/src/jennifer/migration/runner.cr:27:9 in 'migrate'
lib/jennifer/src/jennifer/sam.cr:6:5 in '->'
lib/sam/src/sam/task.cr:255:3 in 'call'
lib/sam/src/sam.cr:43:5 in 'invoke'
lib/sam/src/sam.cr:77:7 in 'process_tasks'
lib/sam/src/sam.cr:56:7 in 'help'
src/sam.cr:9:1 in '__crystal_main'
/usr/share/crystal/src/crystal/main.cr:106:5 in 'main_user_code'
/usr/share/crystal/src/crystal/main.cr:92:7 in 'main'
/usr/share/crystal/src/crystal/main.cr:115:3 in 'main'
__libc_start_main
_start
???
dbachinin commented 4 years ago

And regardless of the presence of fields, I get this error.

imdrasil commented 4 years ago

hi @dbachinin , sorry for a long response. Ensure please that you can access to the database with specified in database.yml options and are able to create a database/table. Also what version of Jennifer do you use? Have you tried master one?

dbachinin commented 4 years ago

hi @dbachinin , sorry for a long response. Ensure please that you can access to the database with specified in database.yml options and are able to create a database/table. Also what version of Jennifer do you use? Have you tried master one?

Hi! @imdrasil . Yes. My login/password is correct.

defaults : &defaults
  host: localhost
  adapter: postgres
  user: postgres
  password: p@ssw0rd
  migration_files_path: db/migrations

development:
  db: blog_development
  <<: *defaults

test:
  db: blog_test
  <<: *defaults

psql postgres://postgres:p%40ssw0rd@localhost:5432 is worked.

Version of Jennifer 0.8.4

dbachinin commented 4 years ago

Commands crystal src/sam.cr -- db:drop and crystal src/sam.cr -- db:create are working

dbachinin commented 4 years ago

I found reason of this error! Because '@' in password string. I changed %40 instead @. And migration started. But at the end of this process I get other error.

lib/jennifer/src/jennifer/adapter/command_shell/bash.cr:14:9 in 'execute'
lib/jennifer/src/jennifer/adapter/db_command_interface.cr:24:9 in 'execute'
lib/jennifer/src/jennifer/adapter/postgres/command_interface.cr:44:9 in 'generate_schema'
lib/jennifer/src/jennifer/adapter/base.cr:190:9 in 'generate_schema'
lib/jennifer/src/jennifer/migration/runner.cr:22:9 in 'migrate'
lib/jennifer/src/jennifer/migration/runner.cr:27:9 in 'migrate'
lib/jennifer/src/jennifer/sam.cr:6:5 in '->'
lib/sam/src/sam/task.cr:255:3 in 'call'
lib/sam/src/sam.cr:43:5 in 'invoke'
lib/sam/src/sam.cr:77:7 in 'process_tasks'
lib/sam/src/sam.cr:56:7 in 'help'
src/sam.cr:9:1 in '__crystal_main'
/usr/share/crystal/src/crystal/main.cr:106:5 in 'main_user_code'
/usr/share/crystal/src/crystal/main.cr:92:7 in 'main'
/usr/share/crystal/src/crystal/main.cr:115:3 in 'main'
__libc_start_main
_start
???
dbachinin commented 4 years ago

maybe connect by psql using uri? Like as: psql postgres://postgres:my_pass@localhost:5432?

imdrasil commented 4 years ago

good point - login and password are put into connection string "as is" without escaping. will fix :+1:

imdrasil commented 4 years ago

fixed