Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Ruby Postgres 2009

4,994 views

Published on

Published in: Technology
  • Be the first to comment

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ドキュメントを読みましょう

×