• Like
Ruby Postgres 2009
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

Ruby Postgres 2009

  • 4,076 views
Published

 

Published in Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
4,076
On SlideShare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
9
Comments
0
Likes
4

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

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