createdb not recognized as a command when using ActiveRecord

跟風遠走 提交于 2019-12-11 12:39:42

问题


I'm a newbie to Ruby and web development. I'm using Windows 7 64-bit with Ruby 2.0 and I have PostgreSQL 9.4 installed.

I'm trying to use ActiveRecord to create a database. I checked that my postgresql server is running and I did bundle install to make sure I had all the required gems. However, when I try to do the terminal command "bundle exec rake create:db" it tells me that "'createdb' is not recognized as an internal or external command, operable program or batch file." I also did the command with --trace but it did not provide more helpful output on what the issue is. The terminal just shows this:

C:\Users\MH\Desktop\activerecord-template> bundle exec rake db:create
Creating activerecord-template development and test databases if they don't exist...
'createdb' is not recognized as an internal or external command, operable program or batch file.

C:\Users\MH\Desktop\activerecord-template> bundle exec rake db:create --trace
**Invoke db:create (first_time)
**Execute db:create
'createdb' is not recognized as an internal or external command, operable program or batch file.

The closest thing I have found regarding this issue is located at this link: http://bobbyong.com/blog/installing-postgresql-on-windoes/. I did adjust the path of PostGreSQL as described in the link, but I still get the same createdb issue. I also uninstalled/reinstalled PostGreSQL. I can see a createdb file in the PostGreSQL directory and createdb works as a command when I use psql so I'm not sure exactly what the issue is with ActiveRecord.

This is what is in my Gemfile:

source 'https://rubygems.org'

gem 'activerecord'
gem 'pg'

gem 'rspec'
gem 'faker'

gem 'rake'

This is what is inside my Rakefile:

    require 'rake'
    require 'rspec/core/rake_task'
    require 'active_support'
    require 'active_support/core_ext'

    require_relative 'config'

    namespace :db do
      desc "Drop, create, and migrate the database"
      task :reset => [:drop, :create, :migrate]

      desc "Create #{APP_NAME} databases"
      task "create" do
        puts "Creating #{APP_NAME} development and test databases if they don't exist..."
        system("createdb #{DB_NAME} --username #{DB_USERNAME} -w --no-password && createdb #{TEST_DB_NAME} --username #{DB_USERNAME} -w --no-password")
      end

      desc "Drop #{APP_NAME} databases"
      task "drop" do
        puts "Dropping #{APP_NAME} development and test databases..."
        system("dropdb #{DB_NAME} && dropdb #{TEST_DB_NAME}_test")
      end

      desc "Migrate the database"
      task "migrate" do
        ActiveRecord::Migrator.migrations_paths << File.dirname(__FILE__) + 'db/migrate'
        ActiveRecord::Migration.verbose = true
        ActiveRecord::Migrator.migrate(ActiveRecord::Migrator.migrations_paths, nil)
      end

      desc "Populate the database with sample data"
      task "seed" do
        require APP_ROOT.join('db', 'seeds.rb')
      end
    end

    namespace :generate do
      desc "Create a database migration\n rake generate:migration NAME=create_people"
      task :migration do
        unless ENV.has_key?('NAME')
          raise "Must specify NAME for migration, e.g. rake generate:migration NAME=create_people"
        end

        migration_name = ENV['NAME']
        class_name = migration_name.camelize
        timestamp = Time.now.strftime('%Y%m%d%H%M%S')
        filename = "#{timestamp}_#{migration_name}.rb"
        path = APP_ROOT.join('db', 'migrate', filename)

        if File.exist?(path)
          raise "ERROR! File '#{path}' already exists"
        end

        puts "Creating migration at #{path}"
        File.open(path, 'w+') do |f|
          f.write("class #{class_name} < ActiveRecord::Migration\n\tdef change\n\n\tend\nend")
        end
      end
    end

    desc 'Start IRB with application environment loaded'
    task "console" do
      exec "irb -r./config"
    end

    desc "Run the specs"
    RSpec::Core::RakeTask.new(:spec)
    task :default  => :specs

    # Will this not work?
    #desc "Run the specs"
    #task 'specs' do
    #  exec "rspec spec"
    #end

This is what is inside my config.rb file:

require 'pathname'
require 'pg'
require 'active_record'
require 'logger'

## Load all files and configure the db

APP_ROOT = Pathname.new(File.expand_path(File.dirname(__FILE__)))

APP_NAME = APP_ROOT.basename.to_s

DB_PATH  = APP_ROOT.join('db', APP_NAME + "_development.db").to_s

DB_NAME = APP_NAME + "_development.db"

TEST_DB_NAME = APP_NAME + "_test.db"

DB_USERNAME = 'postgres'

DB_PASSWORD = 

if ENV['DEBUG']
  ActiveRecord::Base.logger = Logger.new(STDOUT)
end


Dir[APP_ROOT.join('models', '*.rb')].each do |model_file|
  filename = File.basename(model_file).gsub('.rb', '')
  autoload ActiveSupport::Inflector.camelize(filename), model_file
end

ActiveRecord::Base.establish_connection :adapter  => 'postgresql',
                                        :database => DB_NAME,
                                        :host => 'localhost',
                                        :username => DB_USERNAME,
                                        :password => DB_PASSWORD

回答1:


If the terminal command "bundle exec rake create:db" produces the error "'createdb' is not recognized as an internal or external command, operable program or batch file.", this means that ActiveRecord is not able to find createdb.exe in the PostgreSQL directory.

You must append the PostgreSQL bin and lib folders to your path environment variable as described here: http://bobbyong.com/blog/installing-postgresql-on-windoes/

Do note it is important to put the bin path before the lib path or ActiveRecord will still not be able to find createdb.exe in the bin path. Also be sure to restart your command terminal so that any changes to the environment variables can take effect.



来源:https://stackoverflow.com/questions/30742806/createdb-not-recognized-as-a-command-when-using-activerecord

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!