SlideShare a Scribd company logo
RubyでPostgreSQLと
    お話しする方法

(株)サイクル・オブ・フィフス
      石田朗雄
自己紹介等 / PostgreSQLの方から来ました
 (Hatena|Twitter)id:iakio / 石田@苫小牧市
 PostgreSQL徹底入門(翔泳社)
 pgpool-II Developer
 http://postgresql.g.hatena.ne.jp
 普段はPHP、C、Java、C++等
 Rubyはあんまり詳しくないです
 たまにruby-sapporo勉強会に顔を出しています
(宣伝)JPUG北海道支部
 2004年から細々と勉強会やイベントをやったりやらな
  かったり
    「PostgreSQLで学ぶBoyer-Mooreアルゴリズム」
    「PostgreSQL8.3はいかにしてTEXT型のサイズを3バイト縮
     めたか」
    PostgreSQLを使う上では特に役に立たないかもしれません
    自分の知識を発表する→普通の勉強会
    知らないしやったこと無いけど気になってることを当日ま
     でに必死で調べて発表する→JPUG北海道Style
RubyとPostgreSQL
プログラムからSQLを実行するということ
 クライアント/サーバー間のソケット通信
 Frontend/Backendプロトコルの仕様もドキュメントに
  含まれています
 http://www.postgresql.jp/document/current/html/p
  rotocol.html
2種類の実装
 Frontend/Backendプロトコルを実装したC言語のライ
  ブラリ(libpq.so又はlibpq.dll)
RubyとPostgreSQL
 ruby-postgres(1997-)
     http://rubyforge.org/projects/ruby-postgres
     libpqを使った実装
 postgres-pr
     http://rubyforge.org/projects/postgres-pr
     Pure Ruby版
     Cコンパイラが使えない環境
     libpqが使えない環境
第6回 Ruby勉強会@札幌 2007-11-17
 http://www.slideshare.net/iakio/ruby-postgres
 ruby-postgres → 微妙
 postgres-pr → なにそれ
  こわい
postgres-pr VS ruby-postgres
                                                      ruby-postgres
PGconn.instance_methods(false).sort
=> ["async_exec", "async_query", "client_encoding", "close", "db",
"endcopy", "error", "exec", "finish", "get_notify", "getline", "host",
"insert_table", "lo_create", "lo_export", "lo_import", "lo_open",
"lo_unlink", "locreate", "loexport", "loimport", "loopen", "lounlink",
"on_notice", "options", "port", "protocol_version", "putline", "query",
"reset", "select_one", "select_value", "select_values", "server_version",
"set_client_encoding", "status", "trace", "transaction_status", "tty",
"untrace", "user"]

                                                         postgres-pr
PGconn.instance_methods(false).sort
=> ["close", "db", "exec", "host", "query", "user"]
ruby-pg登場
 http://rubyforge.org/projects/ruby-pg/
PGconn.instance_methods(false).sort                        ruby-pg
=> [:async_exec, :async_query, :backend_pid, :block, :cancel, :close,
:conndefaults, :connect_poll, :connection_needs_password,
:connection_used_password, :consume_input, :db, :describe_portal,
:describe_prepared, :error_message, :escape, :escape_bytea,
:escape_string, :exec, :exec_prepared, :finish, :flush,
:get_client_encoding, :get_copy_data, :get_last_result, :get_result,
:host, :is_busy, :isnonblocking, :lo_close, :lo_creat, :lo_create,
:lo_export, :lo_import, :lo_lseek, :lo_open, :lo_read, :lo_seek,
:lo_tell, :lo_truncate, :lo_unlink, :lo_write, :loclose, :locreat,
:locreate, :loexport, :loimport, :lolseek, :loopen, :loread, :loseek,
:lotell, :lotruncate, :lounlink, :lowrite, :make_empty_pgresult,
:notifies, :options, :parameter_status, :pass, :port, :prepare,
:protocol_version, :put_copy_data, :put_copy_end, :query,
:quote_ident, :reset, :reset_poll, :reset_start,
:send_describe_portal, :send_describe_prepared, :send_prepare,
:send_query, :send_query_prepared, :server_version,
:set_client_encoding, :set_error_verbosity, :set_notice_processor,
:set_notice_receiver, :setnonblocking, :socket, :status, :trace,
:transaction, :transaction_status, :tty, :unescape_bytea, :untrace,
:user]
他の言語との比較
 各種ドライバで使われているlibpq関数の数(nm調べ)
 ruby-pgは最強のlibpq wrapper
 ruby-pgはpgpool-IIのデバッグをするときに便利
 残念ながらWindows用のバイナリは配布されてません
ruby-pgの使い方
本を読めばいいと思う
 Ruby逆引きレシピ
 「レシピ100
 PostgreSQLを使いたい」
 以下、重箱の隅をつつくような
 内容にお付き合い下さい
レシピ100.1 接続時のTips
 引数がよくわからん
------------------------------------------------------------ PGconn::new
     PGconn.new(connection_hash) -> PGconn
     PGconn.new(connection_string) -> PGconn
     PGconn.new(host, port, options, tty, dbname, login, password) ->
     PGconn
------------------------------------------------------------------------
     *   +host+ - server hostname

    *    +hostaddr+ - server address (avoids hostname lookup, overrides
         +host+)
…
    *    +connect_timeout+ - maximum time to wait for connection to
         succeed

    *    +options+ - backend options
PGconn.open() == PQconnectdb()
libpqのドキュメントを読みましょう
 http://www.postgresql.jp/document/current/html/li
  bpq-connect.html
 実際けっこう色んなことが書けます
 パスワードは$HOME/.pgpassに書くという方法もある


c = PGconn.open "host=127.0.0.1
 user=ishida dbname=ishida
 connect_timeout=10
 options='-c client_encoding=utf-8
 -c work_mem=1MB
 -c client_min_messages=debug'"
環境変数等
 接続時にオプションが指定されなかった場
  合、PGUSER,PGDATABASE,PGOPTIONS等の環境変数を
  参照する
 http://www.postgresql.jp/document/current/html/li
  bpq-envars.html
$ PGUSER=user1 PGDATABASE=postgres psql
psql (8.4.1)
Type "help" for help.

postgres=# select current_user;
 current_user
--------------
 user1
(1 row)
 たとえばRailsから
# config/database.yaml
development:
...
  database:
  pool: 5
  username:

$ PGDATABASE=blog_development PGUSER=blog script/console
Loading development environment (Rails 2.3.4)
>> ActiveRecord::Base.connection.query "select current_user"
=> [["blog"]]

$ PGDATABASE=blog_development PGUSER=blog script/server
レシピ100.2 bulk load
 タブ区切りやCSVファイルのロード
 サーバー上のファイルにはバックエンドからアクセス
  可能(DBのスーパーユーザー権限が必要)
psqlから
=> copy t1 from '/tmp/copy.data';

Rubyから
c.query "copy t1 from '/tmp/copy.data'"
 クライアント上のファイルのコピー
 スーパーユーザー権限不要
psqlから
=> copy t1 from stdin;
コピーするデータに続いて改行を入力します。
バックスラッシュ()とピリオドだけの行で終了します。
>> 1 One
>> 2 Two
>> .
 PGconn#put_copy_data
 改行に関係なく、任意のサイズで送信できる

PGconn.open "" do |c|
    l = ""
    c.query "copy t1 from stdin"
    open("copy.data", "r") do |f|
        while f.read(8192, l)
            c.put_copy_data l
        end
    end
    c.put_copy_end
end
Ruby Postgres 2009
まとめ
 他にもいろいろ便利な機能があります
 非同期問い合わせ
    ruby-pg + fiber #=> NeverBlockPG
    http://www.scribd.com/doc/18166746/NeverBlockRubyKai
     gi2009
 非同期通知
 SQLSTATEのエラーコードを返す
 SSLサポート
 libpqドキュメントを読みましょう

More Related Content

PDF
PostgreSQL + pgpool構成におけるリカバリ
PDF
日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall
PPTX
CMSとPerlで遊ぼう
PDF
私とmysqlとROLE
PDF
MongoDB Configパラメータ解説
PDF
Webサーバ勉強会03
PDF
MongoDBのはじめての運用テキスト
PDF
serverspecみんなで集めて(゚Д゚)ウマー?
PostgreSQL + pgpool構成におけるリカバリ
日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall
CMSとPerlで遊ぼう
私とmysqlとROLE
MongoDB Configパラメータ解説
Webサーバ勉強会03
MongoDBのはじめての運用テキスト
serverspecみんなで集めて(゚Д゚)ウマー?

What's hot (20)

PDF
Webサーバのチューニング
PDF
第8回KPF発表資料
PPTX
パフォーマンスの良いGASの書き方 Best Practice
PDF
20171103 pg con-jp-lt-plpgsql
PDF
卒研発表
PDF
社内勉強会資料(Varnish Module)
PDF
20171106 ntt-tx-postgre sql-10
PDF
未踏成果発表
PDF
VarnishではじめるESI
PDF
20171028 osc-nagaoka-postgre sql-10
PDF
ノンプログラマのためのウェブサーバ入門
PDF
20140828 #ssmjp 社内チューニンガソンで優勝したはなし
PPT
サーバー実装いろいろ
PPT
第1回鹿児島node.jsの会資料_内村
PPTX
Openjdk 入門してみた話
PDF
今日から使い始めるChef
PPT
ザ・ドキュメント~うまくいかないNoSQL~
PPTX
Apacheチューニング
PDF
serverspecでサーバ環境のテストを書いてみよう
PDF
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
Webサーバのチューニング
第8回KPF発表資料
パフォーマンスの良いGASの書き方 Best Practice
20171103 pg con-jp-lt-plpgsql
卒研発表
社内勉強会資料(Varnish Module)
20171106 ntt-tx-postgre sql-10
未踏成果発表
VarnishではじめるESI
20171028 osc-nagaoka-postgre sql-10
ノンプログラマのためのウェブサーバ入門
20140828 #ssmjp 社内チューニンガソンで優勝したはなし
サーバー実装いろいろ
第1回鹿児島node.jsの会資料_内村
Openjdk 入門してみた話
今日から使い始めるChef
ザ・ドキュメント~うまくいかないNoSQL~
Apacheチューニング
serverspecでサーバ環境のテストを書いてみよう
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
Ad

Viewers also liked (13)

PDF
Ruby Postgres
PDF
PostgreSQLの範囲型と排他制約
PDF
Local php-100828 2
PDF
Getting start with knockout.js
PDF
PostgreSQLで学ぶBoyer-Moore-Horspoolアルゴリズム
PDF
XIDを周回させてみよう
PDF
使いこなそうGUC
PDF
Rubysapporo Stringsearch
PDF
phpspecで学ぶLondon School TDD
PDF
textsearch_jaで全文検索
PDF
よりよいPHPUnitの実行方法を求めて
PPT
Elsevier与Lib2
PDF
Prophecyを使ったユニットテスト
Ruby Postgres
PostgreSQLの範囲型と排他制約
Local php-100828 2
Getting start with knockout.js
PostgreSQLで学ぶBoyer-Moore-Horspoolアルゴリズム
XIDを周回させてみよう
使いこなそうGUC
Rubysapporo Stringsearch
phpspecで学ぶLondon School TDD
textsearch_jaで全文検索
よりよいPHPUnitの実行方法を求めて
Elsevier与Lib2
Prophecyを使ったユニットテスト
Ad

Similar to Ruby Postgres 2009 (20)

PDF
PostgreSQLではじめるOSS開発@OSC 2014 Hiroshima
PDF
Heroku Postgres
PDF
PDF
C16 45分でわかるPostgreSQLの仕組み by 山田努
PDF
Ruby 2.5
PDF
Osc2015 hokkaido postgresql-semi-stuructured-datatype
PDF
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
PDF
OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014
PDF
PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会
PDF
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
PDF
Kof2016 postgresql-9.6
PDF
Hackers Champloo 2016 postgresql-9.6
PDF
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
PDF
MySQLとPostgreSQLにおける基本的なアカウント管理
PDF
Postgresql advent calender 2014 using jsonb by ecpg
PDF
PostgreSQL 10 新機能 @オープンセミナー香川 2017
PDF
[C31] OSS-DB Exam Silver 技術解説セミナー by Ryota Watabe
ODP
PostgreSQL 9.2 新機能 - OSC 2012 Kansai@Kyoto
PDF
いまさら聞けないPostgreSQL運用管理
PDF
PostgreSQL13を検証してみた
PostgreSQLではじめるOSS開発@OSC 2014 Hiroshima
Heroku Postgres
C16 45分でわかるPostgreSQLの仕組み by 山田努
Ruby 2.5
Osc2015 hokkaido postgresql-semi-stuructured-datatype
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014
PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
Kof2016 postgresql-9.6
Hackers Champloo 2016 postgresql-9.6
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
MySQLとPostgreSQLにおける基本的なアカウント管理
Postgresql advent calender 2014 using jsonb by ecpg
PostgreSQL 10 新機能 @オープンセミナー香川 2017
[C31] OSS-DB Exam Silver 技術解説セミナー by Ryota Watabe
PostgreSQL 9.2 新機能 - OSC 2012 Kansai@Kyoto
いまさら聞けないPostgreSQL運用管理
PostgreSQL13を検証してみた

Ruby Postgres 2009