SlideShare a Scribd company logo
Perl RDBMS
                       Programming
                           id:karupanerura


              DBI DBIx::* SQL::* etc...




13年3月23日土曜日
about.me
              id:karupanerura

               かるぱねるら

              web engineer

              c/js/perl/elisp

              さいきんH本読んでる

              MF


13年3月23日土曜日
あじぇんだ!!


              DBI

              DBIx::Sunny

              and more...

              まとめ




13年3月23日土曜日
DBI!!!!!




13年3月23日土曜日
DBIってなに?

              PerlでRDBMSを透過的に扱うためのインターフ
              ェース

              対応するDBD::*をcpanmしておくとそいつが通
              信とかをよしなにしてくれる

              DBIつかう人はSQL文の互換性だけきにすれば
              いい

               細かい機能は一部非互換だったりするが割愛


13年3月23日土曜日
DBIをいれる



              % cpanm DBI

              % cpanm DBD::mysql # pg,Oracle,DB2,etc...




13年3月23日土曜日
DBIをつかう


       use DBI;

       my $dbh = DBI->connect('dbi:SQLite:dbname=:memory:');

       # .....

       $dbh->disconnect;




13年3月23日土曜日
DBIをつかう

       use DBI;

       # SQLite(memory)
       my $dbh = DBI->connect('dbi:SQLite:dbname=:memory:');

       # SQLite(file)
       my $dbh = DBI->connect('dbi:SQLite:dbname=local.sqlite');

       # MySQL
       my $dbh = DBI->connect(
           'dbi:mysql:database=hoge;host=localhost',
           'username',
           'password',
       );




13年3月23日土曜日
べんりメソッド

              selectrow_*系

              selectall_*系

              selectcol_*系

              do

              prepare(_cached)?/execute



13年3月23日土曜日
よくつかうやつ


              selectrow_array / selectrow_hashref

              selectall_arrayref

              selectcol_arrayref

              do




13年3月23日土曜日
selectrow_array


       # こんなかんじでかえってくる
       # (1)

       my ($id) = $dbh->selectrow_array(
           'SELECT id FROM chibapm WHERE name = ?', undef, 'kaztr'
       );




13年3月23日土曜日
selectrow_hashref


       # こんなかんじでかえってくる
       # { id => 1, name => 'kaztr' };

       my $row = $dbh->selectrow_hashref(
           'SELECT id, name FROM chibapm WHERE name = ?', undef, 'kaztr',
       );




13年3月23日土曜日
selectall_arrayref

       # こんなかんじでかえってくる
       # [
       #    { id => 1, name => 'kaztr' },
       #    { id => 2, name => 'yoku0825' },
       #    { id => 3, name => 'hide_o_55' },
       # ];

       my $chibapm_list = $dbh->selectall_arrayref(
           'SELECT id, name FROM chibapm WHERE name IN (?, ?, ?)',
            +{ Slice => +{} },
           'kaztr', 'yoku0825', 'hide_o_55'
       );




13年3月23日土曜日
selectcol_arrayref(1)


       # こんなかんじでかえってくる
       # [ 1, 2, 3 ];

       my $chibapm_id_list = $dbh->selectcol_arrayref(
           'SELECT id FROM chibapm WHERE name IN (?, ?, ?)',
            undef,
           'kaztr', 'yoku0825', 'hide_o_55'
       );




13年3月23日土曜日
selectcol_arrayref(2)


       # こんなかんじでかえってくる
       # [ 'kaztr', 1, 'yoku0825', 2, 'hide_o_55', 3 ];

       my $chibapm_name2id_map = $dbh->selectcol_arrayref(
           'SELECT name, id FROM chibapm WHERE name IN (?, ?, ?)',
            +{ Columns => [1, 2] },
           'kaztr', 'yoku0825', 'hide_o_55'
       );




13年3月23日土曜日
selectcol_arrayref(3)

       # こんなかんじでかえってくる
       # (
       #    'kaztr'     => 1,
       #    'yoku0825' => 2,
       #    'hide_o_55' => 3,
       # );

       my %chibapm_name2id_map = @{ $dbh->selectcol_arrayref(
            'SELECT name, id FROM chibapm WHERE name IN (?, ?, ?)',
             +{ Columns => [1, 2] },
            'kaztr', 'yoku0825', 'hide_o_55'
       ) };

       say $chibapm_name2id_map{kaztr}; # 1




13年3月23日土曜日
do


       # クエリ実行するだけー
       # 変更された行数か、特になければ'0E0'を返す

       $dbh->do(
           'INSERT INTO chibapm (name) VALUES (?)',
            undef,
           'kenjiskywalker',
       );




13年3月23日土曜日
どきゅめんと



              % perldoc DBI

              % perldoc DBD::mysql # pg,Oracle,DB2,etc...




13年3月23日土曜日
DBIべんり!

              でも・・・




13年3月23日土曜日
おぼえらんない!!


              メソッド名ながい!

              undefだったり+{ Slice => +{} }とかイミフ

              もっとかじゅあるにつかいたい!




13年3月23日土曜日
DBIx::Sunny




13年3月23日土曜日
DBIx::Sunnyとは

              DBIをいいかんじに拡張してくれるライブラリ

               more better DBI的なやつ

               DBIの代わりにこいつを使ういめーじ

               ORMとも併用可能

              類似品にAmon2::DBIがある

               こっちはSQL::Interpとか入ってる



13年3月23日土曜日
DBIx::Sunnyのイイトコ
              DBIをいいかんじに拡張してくれてる
              素のDBIの挙動を全く壊さないので導入がおてがる

              基本的な使い方もDBIとおんなじ

              DBIのハマりどころを簡単にしてくれる

              クエリにコメントを埋め込んでくれる
              クエリだけ見てどこのコードで吐かれた奴か分かる
              SELECT /* hoge.pl line 3. */ id, name .....

13年3月23日土曜日
DBIx::Sunnyのイイトコ

              IN句がつかいやすい
               IN(?, ?, ?) とか?の数をきにしなくても

               IN(?) で ArrayRef渡すといいかんじに展開する

              selectall_arrayrefとかのへんなイディオムおぼえな
              くていい

              安心のkazeburoware



13年3月23日土曜日
DBIx::Sunnyのメソッド

              select_one

              select_row

              select_all

              query (doのかわり的なやつ)

              fill_arrayref (ArrayRefを展開してくれる君)



13年3月23日土曜日
select_one


       # こんなかんじでかえってくる
       # 1

       my $id = $dbh->select_one(
           'SELECT id FROM chibapm WHERE name = ?', 'kaztr'
       );

       # DBI#selectrow_array でもだいたいおなじことできる!




13年3月23日土曜日
select_row


       # こんなかんじでかえってくる
       # { id => 1, name => 'kaztr' };

       my $row = $dbh->select_row(
           'SELECT id, name FROM chibapm WHERE name = ?', 'kaztr',
       );

       # DBI#selectrow_hashref とおんなじ!




13年3月23日土曜日
select_all

       # こんなかんじでかえってくる
       # [
       #    { id => 1, name => 'kaztr' },
       #    { id => 2, name => 'yoku0825' },
       #    { id => 3, name => 'hide_o_55' },
       # ];

       my $chibapm_list = $dbh->select_all(
           'SELECT id, name FROM chibapm WHERE name IN (?)',
           ['kaztr', 'yoku0825', 'hide_o_55']
       );

       # DBI#selectall_arrayref でもだいたいおんなじことできる




13年3月23日土曜日
query


       $dbh->query(
           'INSERT INTO chibapm (name) VALUES (?)',
           'kenjiskywalker',
       );

       # DBI#do とだいたいおんなじ




13年3月23日土曜日
まだまだあるべんり君
              last_insert_id

               最後にinsertした行のAUTO_INCREMENTなid
               がとれる

              connect_info

               接続先情報(connectに渡す奴)が取れる

              txn_scope

               DBIx::TransactionManager#txn_scope

13年3月23日土曜日
DBIx::Sunny
               べんり!


13年3月23日土曜日
and more...

              オススメ周辺モジュール




13年3月23日土曜日
and more...

              DBIx::Handler
               タイムアウト時の再接続とかをサポート

              DBIx::TransactionManager
               ネストしたトランザクションの扱いをサポート

              Teng

               上の2つの機能を備えた軽量ORM


13年3月23日土曜日
まとめ!
              DBIべんり!

               selectcol_arrayrefを使いこなせ

              DBIx::Sunnyべんり!

               クエリビルダ使わないときのお供に最高

               DBIのハマりどころをよしなにしてくれる

              DBIx::Handlerなども併せると更に便利に!


13年3月23日土曜日
thank you for listening!!
                  presented by @karupanerura.


13年3月23日土曜日

More Related Content

Perl RDBMS Programming(DBI/DBIx::Sunnyのはなし)

  • 1. Perl RDBMS Programming id:karupanerura DBI DBIx::* SQL::* etc... 13年3月23日土曜日
  • 2. about.me id:karupanerura かるぱねるら web engineer c/js/perl/elisp さいきんH本読んでる MF 13年3月23日土曜日
  • 3. あじぇんだ!! DBI DBIx::Sunny and more... まとめ 13年3月23日土曜日
  • 5. DBIってなに? PerlでRDBMSを透過的に扱うためのインターフ ェース 対応するDBD::*をcpanmしておくとそいつが通 信とかをよしなにしてくれる DBIつかう人はSQL文の互換性だけきにすれば いい 細かい機能は一部非互換だったりするが割愛 13年3月23日土曜日
  • 6. DBIをいれる % cpanm DBI % cpanm DBD::mysql # pg,Oracle,DB2,etc... 13年3月23日土曜日
  • 7. DBIをつかう use DBI; my $dbh = DBI->connect('dbi:SQLite:dbname=:memory:'); # ..... $dbh->disconnect; 13年3月23日土曜日
  • 8. DBIをつかう use DBI; # SQLite(memory) my $dbh = DBI->connect('dbi:SQLite:dbname=:memory:'); # SQLite(file) my $dbh = DBI->connect('dbi:SQLite:dbname=local.sqlite'); # MySQL my $dbh = DBI->connect( 'dbi:mysql:database=hoge;host=localhost', 'username', 'password', ); 13年3月23日土曜日
  • 9. べんりメソッド selectrow_*系 selectall_*系 selectcol_*系 do prepare(_cached)?/execute 13年3月23日土曜日
  • 10. よくつかうやつ selectrow_array / selectrow_hashref selectall_arrayref selectcol_arrayref do 13年3月23日土曜日
  • 11. selectrow_array # こんなかんじでかえってくる # (1) my ($id) = $dbh->selectrow_array( 'SELECT id FROM chibapm WHERE name = ?', undef, 'kaztr' ); 13年3月23日土曜日
  • 12. selectrow_hashref # こんなかんじでかえってくる # { id => 1, name => 'kaztr' }; my $row = $dbh->selectrow_hashref( 'SELECT id, name FROM chibapm WHERE name = ?', undef, 'kaztr', ); 13年3月23日土曜日
  • 13. selectall_arrayref # こんなかんじでかえってくる # [ # { id => 1, name => 'kaztr' }, # { id => 2, name => 'yoku0825' }, # { id => 3, name => 'hide_o_55' }, # ]; my $chibapm_list = $dbh->selectall_arrayref( 'SELECT id, name FROM chibapm WHERE name IN (?, ?, ?)', +{ Slice => +{} }, 'kaztr', 'yoku0825', 'hide_o_55' ); 13年3月23日土曜日
  • 14. selectcol_arrayref(1) # こんなかんじでかえってくる # [ 1, 2, 3 ]; my $chibapm_id_list = $dbh->selectcol_arrayref( 'SELECT id FROM chibapm WHERE name IN (?, ?, ?)', undef, 'kaztr', 'yoku0825', 'hide_o_55' ); 13年3月23日土曜日
  • 15. selectcol_arrayref(2) # こんなかんじでかえってくる # [ 'kaztr', 1, 'yoku0825', 2, 'hide_o_55', 3 ]; my $chibapm_name2id_map = $dbh->selectcol_arrayref( 'SELECT name, id FROM chibapm WHERE name IN (?, ?, ?)', +{ Columns => [1, 2] }, 'kaztr', 'yoku0825', 'hide_o_55' ); 13年3月23日土曜日
  • 16. selectcol_arrayref(3) # こんなかんじでかえってくる # ( # 'kaztr' => 1, # 'yoku0825' => 2, # 'hide_o_55' => 3, # ); my %chibapm_name2id_map = @{ $dbh->selectcol_arrayref( 'SELECT name, id FROM chibapm WHERE name IN (?, ?, ?)', +{ Columns => [1, 2] }, 'kaztr', 'yoku0825', 'hide_o_55' ) }; say $chibapm_name2id_map{kaztr}; # 1 13年3月23日土曜日
  • 17. do # クエリ実行するだけー # 変更された行数か、特になければ'0E0'を返す $dbh->do( 'INSERT INTO chibapm (name) VALUES (?)', undef, 'kenjiskywalker', ); 13年3月23日土曜日
  • 18. どきゅめんと % perldoc DBI % perldoc DBD::mysql # pg,Oracle,DB2,etc... 13年3月23日土曜日
  • 19. DBIべんり! でも・・・ 13年3月23日土曜日
  • 20. おぼえらんない!! メソッド名ながい! undefだったり+{ Slice => +{} }とかイミフ もっとかじゅあるにつかいたい! 13年3月23日土曜日
  • 22. DBIx::Sunnyとは DBIをいいかんじに拡張してくれるライブラリ more better DBI的なやつ DBIの代わりにこいつを使ういめーじ ORMとも併用可能 類似品にAmon2::DBIがある こっちはSQL::Interpとか入ってる 13年3月23日土曜日
  • 23. DBIx::Sunnyのイイトコ DBIをいいかんじに拡張してくれてる 素のDBIの挙動を全く壊さないので導入がおてがる 基本的な使い方もDBIとおんなじ DBIのハマりどころを簡単にしてくれる クエリにコメントを埋め込んでくれる クエリだけ見てどこのコードで吐かれた奴か分かる SELECT /* hoge.pl line 3. */ id, name ..... 13年3月23日土曜日
  • 24. DBIx::Sunnyのイイトコ IN句がつかいやすい IN(?, ?, ?) とか?の数をきにしなくても IN(?) で ArrayRef渡すといいかんじに展開する selectall_arrayrefとかのへんなイディオムおぼえな くていい 安心のkazeburoware 13年3月23日土曜日
  • 25. DBIx::Sunnyのメソッド select_one select_row select_all query (doのかわり的なやつ) fill_arrayref (ArrayRefを展開してくれる君) 13年3月23日土曜日
  • 26. select_one # こんなかんじでかえってくる # 1 my $id = $dbh->select_one( 'SELECT id FROM chibapm WHERE name = ?', 'kaztr' ); # DBI#selectrow_array でもだいたいおなじことできる! 13年3月23日土曜日
  • 27. select_row # こんなかんじでかえってくる # { id => 1, name => 'kaztr' }; my $row = $dbh->select_row( 'SELECT id, name FROM chibapm WHERE name = ?', 'kaztr', ); # DBI#selectrow_hashref とおんなじ! 13年3月23日土曜日
  • 28. select_all # こんなかんじでかえってくる # [ # { id => 1, name => 'kaztr' }, # { id => 2, name => 'yoku0825' }, # { id => 3, name => 'hide_o_55' }, # ]; my $chibapm_list = $dbh->select_all( 'SELECT id, name FROM chibapm WHERE name IN (?)', ['kaztr', 'yoku0825', 'hide_o_55'] ); # DBI#selectall_arrayref でもだいたいおんなじことできる 13年3月23日土曜日
  • 29. query $dbh->query( 'INSERT INTO chibapm (name) VALUES (?)', 'kenjiskywalker', ); # DBI#do とだいたいおんなじ 13年3月23日土曜日
  • 30. まだまだあるべんり君 last_insert_id 最後にinsertした行のAUTO_INCREMENTなid がとれる connect_info 接続先情報(connectに渡す奴)が取れる txn_scope DBIx::TransactionManager#txn_scope 13年3月23日土曜日
  • 31. DBIx::Sunny べんり! 13年3月23日土曜日
  • 32. and more... オススメ周辺モジュール 13年3月23日土曜日
  • 33. and more... DBIx::Handler タイムアウト時の再接続とかをサポート DBIx::TransactionManager ネストしたトランザクションの扱いをサポート Teng 上の2つの機能を備えた軽量ORM 13年3月23日土曜日
  • 34. まとめ! DBIべんり! selectcol_arrayrefを使いこなせ DBIx::Sunnyべんり! クエリビルダ使わないときのお供に最高 DBIのハマりどころをよしなにしてくれる DBIx::Handlerなども併せると更に便利に! 13年3月23日土曜日
  • 35. thank you for listening!! presented by @karupanerura. 13年3月23日土曜日