PostgreSQL for Rails on Apple OS X

This could be a short tutorial to follow along, how to setup PostgreSQL for your development environment. Basically it’s going to be a sharing my experience about, when I tried to understand more of it from my Rails Meetup Study Group.


I’ve done it on Apple machine, so started with following (Just in case, starting this with brew updating)

brew update && brew upgrade
brew install postgres

Of course it should be done after you install homebrew package manager first if not done yet, and for me I simply followed their easiest way on brew.sh page.

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Check if following psql command working. (you will see your username of the machine in place of your_username, and more lines omitted here.)

$ psql --help
psql is the PostgreSQL interactive terminal.

General options:
  -d, --dbname=DBNAME      database name to connect to (default: "your_username")

Connection options:
  -h, --host=HOSTNAME      database server host or socket directory (default: "local socket")
  -p, --port=PORT          database server port (default: "5432")
  -U, --username=USERNAME  database user name (default: "your_username")
  -w, --no-password        never prompt for password
  -W, --password           force password prompt (should happen automatically)

That means for example, when you type simply this command:

psql

without any options like -d some_dbname or --dbname=some_dbname, then it considers your command as something like following:

psql -U your_username -d your_username

However, because it said “The first database is always created by the initdb command when the data storage area is initialized. This database is called postgres.” on the documentation, so I did

psql -d postgres

…and got an error. This error was given because I didn’t do create the first database by the initdb command. I followed another page of documentation: “There is no default, although locations such as /usr/local/pgsql/data or /var/lib/pgsql/data are popular.”

$ initdb -D /usr/local/pgsql/data

Done.

$ psql -d postgres 
\psql (9.4.4)
Type "help" for help.

postgres=#

Now this should be working (exit with \q by the way. for all other backslash commands, check here) while database running.


Always don’t forget the database must be up and running to use it. For starting postgres, generally you do

postgres -D /usr/local/pgsql/data

But again, I’ve done it on Apple machine, I consider you may brew services start after you install homebrew services because it’s very simple.

brew tap homebrew/services

and then

brew services start postgresql
brew services list

Now all done, and let’s start with rails new command with --database option!

rails new app_name -d postgresql

If it’s already in the middle of working with sqlite3 gem in your Gemfile, you may change it from something like this

group :development, :test do
  gem 'sqlite3'
end

into this

group :development, :test do
  gem 'pg'
end

And edit config/database.yml file from something like

default: &default
  adapter: sqlite3
  pool: 5
  timeout: 5000

development:
  <<: *default
  database: db/development.sqlite3

into something like

default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5

development:
  <<: *default
  database: app_name_development

or you may config username and password to access the database:

development:
  adapter: postgresql
  encoding: unicode
  database: app_name_development
  pool: 5
  username: your_username
  password:

By the way your your_username is not necessary here. Because we mentioned psql command has –username=your_username (Mac user name) by default. (You can always set the username and password up differently, but I don’t think it necessary in development.)


Databases named app_name_development or app_name_test should be created by

rake db:create

And then, go back to normal Rails development and test, maybe with

rake db:migration

and so on. They say you should use pg gem because it’s the same one with default database of heroku. Maybe that might be why you are going to do this.

 
0
Kudos
 
0
Kudos

Now read this

Ruby block

I’ve been trying to figure out how it works. This morning I wanted to write it down my thinking process today, before I forget. block_given? block_given? is a method of Kernel module. In other words, it’s one of the same kind of puts,... Continue →