RubyでPostgreSQLと
    お話しする方法

(株)サイクル・オブ・フィフス
      石田朗雄
自己紹介等 / PostgreSQLの方から来ました
 (Hatena|Twitter)id:iakio / 石田@苫小牧市
 PostgreSQL徹底入門(翔泳社)
 pgpool-II Developer
 http://postg...
(宣伝)JPUG北海道支部
 2004年から細々と勉強会やイベントをやったりやらな
  かったり
    「PostgreSQLで学ぶBoyer-Mooreアルゴリズム」
    「PostgreSQL8.3はいかにしてTEXT型のサイズ...
RubyとPostgreSQL
プログラムからSQLを実行するということ
 クライアント/サーバー間のソケット通信
 Frontend/Backendプロトコルの仕様もドキュメントに
  含まれています
 http://www.postgresql.jp/documen...
2種類の実装
 Frontend/Backendプロトコルを実装したC言語のライ
  ブラリ(libpq.so又はlibpq.dll)
RubyとPostgreSQL
 ruby-postgres(1997-)
     http://rubyforge.org/projects/ruby-postgres
     libpqを使った実装
 postgres-pr
 ...
第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(f...
ruby-pg登場
 http://rubyforge.org/projects/ruby-pg/
PGconn.instance_methods(false).sort                        ruby-pg
=> [:async_exec, :async_query, :backend_pid, :block, :c...
他の言語との比較
 各種ドライバで使われているlibpq関数の数(nm調べ)
 ruby-pgは最強のlibpq wrapper
 ruby-pgはpgpool-IIのデバッグをするときに便利
 残念ながらWindows用のバイナリは配布されてません
ruby-pgの使い方
本を読めばいいと思う
 Ruby逆引きレシピ
 「レシピ100
 PostgreSQLを使いたい」
 以下、重箱の隅をつつくような
 内容にお付き合い下さい
レシピ100.1 接続時のTips
 引数がよくわからん
------------------------------------------------------------ PGconn::new
     PGconn.new(con...
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_...
環境変数等
 接続時にオプションが指定されなかった場
  合、PGUSER,PGDATABASE,PGOPTIONS等の環境変数を
  参照する
 http://www.postgresql.jp/document/current/html...
 たとえばRailsから
# config/database.yaml
development:
...
  database:
  pool: 5
  username:

$ PGDATABASE=blog_development PGU...
レシピ100.2 bulk load
 タブ区切りやCSVファイルのロード
 サーバー上のファイルにはバックエンドからアクセス
  可能(DBのスーパーユーザー権限が必要)
psqlから
=> copy t1 from '/tmp/copy...
 クライアント上のファイルのコピー
 スーパーユーザー権限不要
psqlから
=> copy t1 from stdin;
コピーするデータに続いて改行を入力します。
バックスラッシュ()とピリオドだけの行で終了します。
>> 1 One
...
 PGconn#put_copy_data
 改行に関係なく、任意のサイズで送信できる

PGconn.open "" do |c|
    l = ""
    c.query "copy t1 from stdin"
    open(...
まとめ
 他にもいろいろ便利な機能があります
 非同期問い合わせ
    ruby-pg + fiber #=> NeverBlockPG
    http://www.scribd.com/doc/18166746/NeverBloc...
Ruby Postgres 2009
Upcoming SlideShare
Loading in …5
×

Ruby Postgres 2009

4,631 views

Published on

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,631
On SlideShare
0
From Embeds
0
Number of Embeds
19
Actions
Shares
0
Downloads
9
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

Ruby Postgres 2009

  1. 1. RubyでPostgreSQLと お話しする方法 (株)サイクル・オブ・フィフス 石田朗雄
  2. 2. 自己紹介等 / PostgreSQLの方から来ました  (Hatena|Twitter)id:iakio / 石田@苫小牧市  PostgreSQL徹底入門(翔泳社)  pgpool-II Developer  http://postgresql.g.hatena.ne.jp  普段はPHP、C、Java、C++等  Rubyはあんまり詳しくないです  たまにruby-sapporo勉強会に顔を出しています
  3. 3. (宣伝)JPUG北海道支部  2004年から細々と勉強会やイベントをやったりやらな かったり  「PostgreSQLで学ぶBoyer-Mooreアルゴリズム」  「PostgreSQL8.3はいかにしてTEXT型のサイズを3バイト縮 めたか」  PostgreSQLを使う上では特に役に立たないかもしれません  自分の知識を発表する→普通の勉強会  知らないしやったこと無いけど気になってることを当日ま でに必死で調べて発表する→JPUG北海道Style
  4. 4. RubyとPostgreSQL
  5. 5. プログラムからSQLを実行するということ  クライアント/サーバー間のソケット通信  Frontend/Backendプロトコルの仕様もドキュメントに 含まれています  http://www.postgresql.jp/document/current/html/p rotocol.html
  6. 6. 2種類の実装  Frontend/Backendプロトコルを実装したC言語のライ ブラリ(libpq.so又はlibpq.dll)
  7. 7. RubyとPostgreSQL  ruby-postgres(1997-)  http://rubyforge.org/projects/ruby-postgres  libpqを使った実装  postgres-pr  http://rubyforge.org/projects/postgres-pr  Pure Ruby版  Cコンパイラが使えない環境  libpqが使えない環境
  8. 8. 第6回 Ruby勉強会@札幌 2007-11-17  http://www.slideshare.net/iakio/ruby-postgres  ruby-postgres → 微妙  postgres-pr → なにそれ こわい
  9. 9. 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"]
  10. 10. ruby-pg登場  http://rubyforge.org/projects/ruby-pg/
  11. 11. 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]
  12. 12. 他の言語との比較  各種ドライバで使われているlibpq関数の数(nm調べ)
  13. 13.  ruby-pgは最強のlibpq wrapper  ruby-pgはpgpool-IIのデバッグをするときに便利  残念ながらWindows用のバイナリは配布されてません
  14. 14. ruby-pgの使い方
  15. 15. 本を読めばいいと思う  Ruby逆引きレシピ  「レシピ100 PostgreSQLを使いたい」  以下、重箱の隅をつつくような 内容にお付き合い下さい
  16. 16. レシピ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
  17. 17. PGconn.open() == PQconnectdb()
  18. 18. libpqのドキュメントを読みましょう  http://www.postgresql.jp/document/current/html/li bpq-connect.html
  19. 19.  実際けっこう色んなことが書けます  パスワードは$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'"
  20. 20. 環境変数等  接続時にオプションが指定されなかった場 合、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)
  21. 21.  たとえば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
  22. 22. レシピ100.2 bulk load  タブ区切りやCSVファイルのロード  サーバー上のファイルにはバックエンドからアクセス 可能(DBのスーパーユーザー権限が必要) psqlから => copy t1 from '/tmp/copy.data'; Rubyから c.query "copy t1 from '/tmp/copy.data'"
  23. 23.  クライアント上のファイルのコピー  スーパーユーザー権限不要 psqlから => copy t1 from stdin; コピーするデータに続いて改行を入力します。 バックスラッシュ()とピリオドだけの行で終了します。 >> 1 One >> 2 Two >> .
  24. 24.  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
  25. 25. まとめ  他にもいろいろ便利な機能があります  非同期問い合わせ  ruby-pg + fiber #=> NeverBlockPG  http://www.scribd.com/doc/18166746/NeverBlockRubyKai gi2009  非同期通知  SQLSTATEのエラーコードを返す  SSLサポート  libpqドキュメントを読みましょう

×