カテゴリー : PostgreSQL

[PostgreSQL][8.0.4] シーケンス関数の引数は regclass型ではなく text型 (ERROR: cannot cast type text to regclass)

PostgreSQL 8.0.4 にて、nextval((‘user_id_seq’::text)::regclass) というように、シーケンス関数の引数を text型ではなく、regclass型を渡してしまったため、エラーが発生しました。

■ エラー内容

ERROR:  cannot cast type text to regclass

■ 参考情報

注意: PostgreSQL 8.1以前においては、シーケンス関数の引数はregclass型ではなく、text型で、そして上記のテキスト文字列からOID値への変換はそれぞれの呼び出し実行時に起こりました。後方互換性のため、この仕組みはまだ存在しますが、内部的には関数が実行される前にtextからregclassへの暗黙的強制型変換として現在処理されています。

・引用元:シーケンス操作関数 はてなブックマーク - シーケンス操作関数

■ SQL文(修正前)

CREATE SEQUENCE user_id_seq INCREMENT 1 START 1000;
 
CREATE TABLE user ( 
	id integer DEFAULT nextval(('user_id_seq'::text)::regclass) NOT NULL,
	name varchar(50) NOT NULL,
	age integer NOT NULL
);

↓(修正)

■ SQL文(修正後)

CREATE SEQUENCE user_id_seq INCREMENT 1 START 1000;
 
CREATE TABLE user ( 
	id integer DEFAULT nextval('user_id_seq') NOT NULL,
	name varchar(50) NOT NULL,
	age integer NOT NULL
);

以上です。

[PostgreSQL] テーブル(table)を csv 出力する方法

PostgreSQLにて、tableのデータを csv 出力する方法を調べたのでメモ。

$ psql dbname
 
dbname=> \o tablenams.csv
dbname=> \a
Output format is unaligned.
dbname=> \pset fieldsep ','
Field separator is ','.
dbname=> select * from tablename;
dbname=> \o
 
\o で出力先を指定
\a で桁そろえをしない
\pset fieldsep でセパレータを指定
タブ区切りは '\t'
select 文で対象データを抽出する。
最後の \o で出力先を戻します。

コマンドラインから行いたい場合は、以下の方法があります。

$ psql -c 'SELECT * FROM tablename;' -A -F,
 
-A 桁そろえをしない
-F セパレータを指定(-F, でカンマ、-F\t でタブ)

参考情報

Postgres でテーブルを csv 出力

PostgreSQL のデータをCSV出力する – IT革命~

[Ruby] Timeオブジェクトの表示形式を変更する方法

Rubyにて、Timeオブジェクトの表示形式を変更する方法を調べたのでメモ。

Time.now.strftime("%Y-%m-%d %H:%M:%S") #=> "2011-11-13 00:31:21"

例えば、PostgreSQLのtimestamp型をdate型の値のように表示したいとします。

eventテーブルのstart_atレコードがtimestamp型だとすると、以下のように書けばOKです。

@event.start_at.strftime("%Y-%m-%d") #=> "2011-11-13"

以上です。

【参考】

逆引きRuby – 日付と時刻 はてなブックマーク - 逆引きRuby - 日付と時刻

[Rails] ActiveRecord とDBの型の対応関係

Ruby on Rails にて、ActiveRecord とDBの型の対応関係を調べたのでメモ。

■ PostgreSQL

Ruby 1.9.2
Rails 3.0.10
PostgreSQL 9.0.4

$ rails console
Loading development environment (Rails 3.0.10)
ruby-1.9.2-p290 :001 > pp ActiveRecord::Base.connection.native_database_types
 => {
:primary_key=>"serial primary key", 
:string=>{:name=>"character varying", :limit=>255}, 
:text=>{:name=>"text"}, 
:integer=>{:name=>"integer"}, 
:float=>{:name=>"float"}, 
:decimal=>{:name=>"decimal"}, 
:datetime=>{:name=>"timestamp"}, 
:timestamp=>{:name=>"timestamp"}, 
:time=>{:name=>"time"}, 
:date=>{:name=>"date"}, 
:binary=>{:name=>"bytea"}, 
:boolean=>{:name=>"boolean"}, 
:xml=>{:name=>"xml"}}

■ MySQL

Ruby 1.9.2
Rails 3.0.1
MySQL 5.1.44

ruby-1.9.2-head > pp ActiveRecord::Base.connection.native_database_types
{
:primary_key=>"int(11) DEFAULT NULL auto_increment PRIMARY KEY", 
:string=>{:name=>"varchar", :limit=>255}, 
:text=>{:name=>"text"}, 
:integer=>{:name=>"int", :limit=>4}, 
:float=>{:name=>"float"}, 
:decimal=>{:name=>"decimal"}, 
:datetime=>{:name=>"datetime"}, 
:timestamp=>{:name=>"datetime"},
:time=>{:name=>"time"}, 
:date=>{:name=>"date"},
:binary=>{:name=>"blob"}, 
:boolean=>{:name=>"tinyint", :limit=>1}
}

参考情報

ActiveRecord と実際のDBの型の対応を確認する – @sugamasao.blog.title # => ”コードで世界を変えたい”

[Rails] Heroku標準のPostgreSQLへのdb:migrateをやり直す方法

Herokuで強制的にdb:migrateをやり直す方法を調べたのでメモ。

まず、HerokuではRails標準のrake db:resetは使えません。

代わりに、pg:resetコマンドで Herokuの標準のpostgresのDBをリセットすることができます。

$ heroku pg:reset --db SHARED_DATABASE_URL

コマンド実行後、確認のためプロンプトが表示されるので、アプリ名を入力するとリセットが実行されます。

ちなみに、SHARED_DATABASE_URLは以下のコマンドで確認できます。

$ heroku console
Ruby console for codenote.heroku.com
>> ENV['DATABASE_URL']
=> "postgres://username:password@ec2-000-00-000-00.compute-1.amazonaws.com/dbname"

・参考:Heroku | Dev Center | PostgreSQL はてなブックマーク - Heroku | Dev Center | PostgreSQL
 

他にも、db:migrateをやり直す方法があり、VERSION=0 を指定することで最初にdb:migrateする前の初期状態に戻すことができます。

(最初にdb:migrateしたときのマイグレーションファイルが存在することが前提)

$ heroku rake db:migrate VERSION=0

また、db:migrate:redo で何回か前の状態(STEP=回数)に戻すこともできます。

$ heroku rake db:migrate:redo STEP=10

以上です。

【参考】

[Rails][Heroku] Herokuで強制的にdb:migrateをやり直す。その2 – mat_akiの日記 はてなブックマーク - [Rails][Heroku] Herokuで強制的にdb:migrateをやり直す。その2 - mat_akiの日記

Herokuで強制的にdb:migrateをやり直す。 – このブログは証明できない。 はてなブックマーク - Herokuで強制的にdb:migrateをやり直す。 - このブログは証明できない。

Ruby on Rails Guides: Migrations はてなブックマーク - Ruby on Rails Guides: Migrations
 

[Mac] Homebrew で PostgreSQL をインストールする手順

Mac に Homebrew で postgresql をインストールしたので手順をメモしておきます。

postgresql のインストール

まず brew コマンドで postgresql をインストールします。

Homebrew をインストールしていない方は、以下を参考にして下さい。

・参考:[Mac] Homebrew をインストール

brew install postgresql

PostgreSQL DB の初期化

initdb /usr/local/var/postgres -E utf8 --no-locale

自動起動の設定

ln -sfv /usr/local/opt/postgresql/*.plist ~/Library/LaunchAgents
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

環境変数 PGDATA の設定

環境変数 PGDATA を設定すると pg_ctl での起動停止時に -D の引数を渡さなくてよくなります。

export PGDATA=/usr/local/var/postgres

起動コマンド

pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start
 
# 環境変数PGDATAの設定をしていれば以下の様に省略できます
pg_ctl -l /usr/local/var/postgres/server.log start

終了コマンド

pg_ctl stop -s -m fast
 
# 環境変数PGDATAの設定をしていれば以下の様に省略できます
pg_ctl -D /usr/local/var/postgres stop -s -m fast

postgres ユーザの作成

brew でインストールした場合 postgres ユーザは作成されないようです。

$USER がスーパーユーザとして作成されます。スーパーユーザーをそのまま使うのはよくないので、新しくユーザを作成します。

$ createuser -P username
# usernameの部分は新規作成するユーザの名前
# パスワードとスーパーユーザにするかどうかを入力する

ユーザがちゃんと作成されたかの確認は下記のコマンドでできます。

psql -q -c'select * from pg_user' postgres

Ruby で postgresql を使うために gem で pg をインストールしておきます。

env ARCHFLAGS="-arch x86_64" gem install pg

 
ちなみに、brew info postgresql コマンドを実行すると以下のように詳細が読めます。

If builds of PostgreSQL 9 are failing and you have version 8.x installed,
you may need to remove the previous version first. See:
  https://github.com/mxcl/homebrew/issues/issue/2510
 
To build plpython against a specific Python, set PYTHON prior to brewing:
  PYTHON=/usr/local/bin/python  brew install postgresql
See:
  http://www.postgresql.org/docs/9.0/static/install-procedure.html
 
 
If this is your first install, create a database with:
  initdb /usr/local/var/postgres
 
If this is your first install, automatically load on login with:
  mkdir -p ~/Library/LaunchAgents
  cp /usr/local/Cellar/postgresql/9.0.4/org.postgresql.postgres.plist ~/Library/LaunchAgents/
  launchctl load -w ~/Library/LaunchAgents/org.postgresql.postgres.plist
 
If this is an upgrade and you already have the org.postgresql.postgres.plist loaded:
  launchctl unload -w ~/Library/LaunchAgents/org.postgresql.postgres.plist
  cp /usr/local/Cellar/postgresql/9.0.4/org.postgresql.postgres.plist ~/Library/LaunchAgents/
  launchctl load -w ~/Library/LaunchAgents/org.postgresql.postgres.plist
 
Or start manually with:
  pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start
 
And stop with:
  pg_ctl -D /usr/local/var/postgres stop -s -m fast
 
 
Some machines may require provisioning of shared memory:
  http://www.postgresql.org/docs/current/static/kernel-resources.html#SYSVIPC
 
If you want to install the postgres gem, including ARCHFLAGS is recommended:
    env ARCHFLAGS="-arch x86_64" gem install pg
 
To install gems without sudo, see the Homebrew wiki.

以上です。

参考情報

[Rails] rake db:migrate コマンドで rake aborted! no such file to load — pg のエラー問題を解決

Railsにて、rake db:migrate コマンドがエラーで実行できない問題を解決したのでメモ。

$ rake db:migrate
rake aborted!
no such file to load -- pg
 
Tasks: TOP => db:migrate
(See full trace by running task with --trace)

アプリケーションルート直下の Gemfile ファイルにて、SQLite3 を使う記述が初期設定のままだったので、これをpostgresqlを使うように書き換えればOKです。

$ vim Gemfile

■ Gemfileから一部抜粋

#Comment out the sqlite3 requirement
#gem 'sqlite3-ruby', :require => 'sqlite3'
#Add a pg requirement
gem 'pg', :require => 'pg'

以上です。

【参考】

Ruby/Rails 3 and PostgreSQL | Peter Mac And Associates はてなブックマーク - Ruby/Rails 3 and PostgreSQL | Peter Mac And Associates

RailsからPostgreSQLに繋がらない~ – Stellaqua – TOMの技術日記 はてなブックマーク - RailsからPostgreSQLに繋がらない~ - Stellaqua - TOMの技術日記