SlideShare ist ein Scribd-Unternehmen logo
1 von 26
Downloaden Sie, um offline zu lesen
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-pg + fiber #=> NeverBlockPG
    http://www.scribd.com/doc/18166746/NeverBlockRubyKai
     gi2009
 非同期通知
 SQLSTATEのエラーコードを返す
 SSLサポート
 libpqドキュメントを読みましょう

Weitere ähnliche Inhalte

Was ist angesagt?

サーバー実装いろいろ
サーバー実装いろいろサーバー実装いろいろ
サーバー実装いろいろ
kjwtnb
 
ザ・ドキュメント~うまくいかないNoSQL~
ザ・ドキュメント~うまくいかないNoSQL~ザ・ドキュメント~うまくいかないNoSQL~
ザ・ドキュメント~うまくいかないNoSQL~
Akihiro Kuwano
 

Was ist angesagt? (20)

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

Andere mochten auch

PostgreSQLの範囲型と排他制約
PostgreSQLの範囲型と排他制約PostgreSQLの範囲型と排他制約
PostgreSQLの範囲型と排他制約
Akio Ishida
 
Getting start with knockout.js
Getting start with knockout.jsGetting start with knockout.js
Getting start with knockout.js
Akio Ishida
 
XIDを周回させてみよう
XIDを周回させてみようXIDを周回させてみよう
XIDを周回させてみよう
Akio Ishida
 
Rubysapporo Stringsearch
Rubysapporo StringsearchRubysapporo Stringsearch
Rubysapporo Stringsearch
Akio Ishida
 

Andere mochten auch (13)

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

Ähnlich wie Ruby Postgres 2009

配布用Beginnerならきっと役立つmaster slave環境
配布用Beginnerならきっと役立つmaster slave環境配布用Beginnerならきっと役立つmaster slave環境
配布用Beginnerならきっと役立つmaster slave環境
yut148atgmaildotcom
 
tcpdump & xtrabackup @ MySQL Casual Talks #1
tcpdump & xtrabackup @ MySQL Casual Talks #1tcpdump & xtrabackup @ MySQL Casual Talks #1
tcpdump & xtrabackup @ MySQL Casual Talks #1
Ryosuke IWANAGA
 
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
Yoshiyuki Asaba
 
gumiStudy#7 The MessagePack Project
gumiStudy#7 The MessagePack ProjectgumiStudy#7 The MessagePack Project
gumiStudy#7 The MessagePack Project
Sadayuki Furuhashi
 
OpenStack + Common Lisp
OpenStack + Common LispOpenStack + Common Lisp
OpenStack + Common Lisp
irix_jp
 

Ähnlich wie Ruby Postgres 2009 (20)

配布用Beginnerならきっと役立つmaster slave環境
配布用Beginnerならきっと役立つmaster slave環境配布用Beginnerならきっと役立つmaster slave環境
配布用Beginnerならきっと役立つmaster slave環境
 
tcpdump & xtrabackup @ MySQL Casual Talks #1
tcpdump & xtrabackup @ MySQL Casual Talks #1tcpdump & xtrabackup @ MySQL Casual Talks #1
tcpdump & xtrabackup @ MySQL Casual Talks #1
 
社内向けTech Talk資料~Fluentdの基本紹介~
社内向けTech Talk資料~Fluentdの基本紹介~ 社内向けTech Talk資料~Fluentdの基本紹介~
社内向けTech Talk資料~Fluentdの基本紹介~
 
CPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したいCPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したい
 
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
 
Puppet on AWS
Puppet on AWSPuppet on AWS
Puppet on AWS
 
MoteMote Compiler Plugin
MoteMote Compiler PluginMoteMote Compiler Plugin
MoteMote Compiler Plugin
 
MySQLとPostgreSQLにおける基本的なアカウント管理
MySQLとPostgreSQLにおける基本的なアカウント管理MySQLとPostgreSQLにおける基本的なアカウント管理
MySQLとPostgreSQLにおける基本的なアカウント管理
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみよう
 
Subprocess no susume
Subprocess no susumeSubprocess no susume
Subprocess no susume
 
Ruby 2.5
Ruby 2.5Ruby 2.5
Ruby 2.5
 
MySQLとPostgreSQLの基本的な実行プラン比較
MySQLとPostgreSQLの基本的な実行プラン比較MySQLとPostgreSQLの基本的な実行プラン比較
MySQLとPostgreSQLの基本的な実行プラン比較
 
Gumi study7 messagepack
Gumi study7 messagepackGumi study7 messagepack
Gumi study7 messagepack
 
gumiStudy#7 The MessagePack Project
gumiStudy#7 The MessagePack ProjectgumiStudy#7 The MessagePack Project
gumiStudy#7 The MessagePack Project
 
Haikara
HaikaraHaikara
Haikara
 
あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界
 
OpenStack + Common Lisp
OpenStack + Common LispOpenStack + Common Lisp
OpenStack + Common Lisp
 
Node予備校 vol.1 名古屋
Node予備校 vol.1 名古屋Node予備校 vol.1 名古屋
Node予備校 vol.1 名古屋
 
Introduction pp.js
Introduction pp.jsIntroduction pp.js
Introduction pp.js
 
20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT
 

Kürzlich hochgeladen

Kürzlich hochgeladen (7)

LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 

Ruby Postgres 2009