blog/content/post/2009/07/13/2009-07-13-00001197.md

248 lines
16 KiB
Markdown
Raw Normal View History

2019-03-31 11:00:21 +00:00
---
title: DBIでPerlからDBに接続
author: kazu634
date: 2009-07-13
wordtwit_post_info:
- 'O:8:"stdClass":13:{s:6:"manual";b:0;s:11:"tweet_times";i:1;s:5:"delay";i:0;s:7:"enabled";i:1;s:10:"separation";s:2:"60";s:7:"version";s:3:"3.7";s:14:"tweet_template";b:0;s:6:"status";i:2;s:6:"result";a:0:{}s:13:"tweet_counter";i:2;s:13:"tweet_log_ids";a:1:{i:0;i:4707;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}'
categories:
- mysql
- Perl
---
<div class="section">
<p>
DBIというモジュールを用いてPerlからDBに接続するサンプルを作成しました。結構簡単だ。DBIについてこれから使い方を調べていこう
</p>
<h4>
MySQLの設定
</h4>
<p>
sampleというデータベースの中に、Shopというテーブルがあります。その中にはaddressというフィールドがあります。
</p>
<pre class="syntax-highlight">
kazu634@kazu634-desktop% mysql -u root -p ~/work/googlemaps [<span class="synConstant">3082</span>]
Enter password:
Welcome <span class="synSpecial">to</span> the MySQL monitor. Commands <span class="synSpecial">end</span> <span class="synSpecial">with</span> ; <span class="synStatement">or</span> \g.
Your MySQL connection id <span class="synSpecial">is</span> <span class="synConstant">72</span>
Server version: <span class="synConstant">5.0</span>.<span class="synConstant">75</span>-0ubuntu10.<span class="synConstant">2</span> (Ubuntu)
<span class="synSpecial">Type</span> <span class="synConstant">'help;'</span> <span class="synStatement">or</span> <span class="synConstant">'\h'</span> <span class="synSpecial">for</span> help. <span class="synSpecial">Type</span> <span class="synConstant">'\c'</span> <span class="synSpecial">to</span> clear the buffer.
mysql&#62; SHOW DATABASES;
+<span class="synComment">--------------------+</span>
| Database |
+<span class="synComment">--------------------+</span>
| information_schema |
| mysql |
| sample |
+<span class="synComment">--------------------+</span>
<span class="synConstant">3</span> <span class="synSpecial">rows</span> <span class="synStatement">in</span> <span class="synStatement">set</span> (<span class="synConstant"></span>.<span class="synConstant">00</span> sec)
mysql&#62; USE sample;
Reading <span class="synSpecial">table</span> information <span class="synSpecial">for</span> completion <span class="synSpecial">of</span> <span class="synSpecial">table</span> <span class="synStatement">and</span> <span class="synSpecial">column</span> names
You can turn off this feature <span class="synSpecial">to</span> get a quicker startup <span class="synSpecial">with</span> -A
Database changed
mysql&#62; SHOW TABLES;
+<span class="synComment">------------------+</span>
| Tables_in_sample |
+<span class="synComment">------------------+</span>
| Shop |
+<span class="synComment">------------------+</span>
<span class="synConstant">1</span> <span class="synSpecial">row</span> <span class="synStatement">in</span> <span class="synStatement">set</span> (<span class="synConstant"></span>.<span class="synConstant">00</span> sec)
mysql&#62; <span class="synSpecial">DESC</span> Shop;
+<span class="synComment">--------------+--------------+------+-----+---------+-------+</span>
| Field | <span class="synSpecial">Type</span> | <span class="synSpecial">Null</span> | Key | <span class="synSpecial">Default</span> | Extra |
+<span class="synComment">--------------+--------------+------+-----+---------+-------+</span>
| shopname | <span class="synType">varchar</span>(<span class="synConstant">80</span>) | YES | | <span class="synSpecial">NULL</span> | |
| address | <span class="synType">varchar</span>(<span class="synConstant">90</span>) | YES | | <span class="synSpecial">NULL</span> | |
| tel | <span class="synType">varchar</span>(<span class="synConstant">15</span>) | YES | | <span class="synSpecial">NULL</span> | |
| shophour | <span class="synType">varchar</span>(<span class="synConstant">50</span>) | YES | | <span class="synSpecial">NULL</span> | |
| accomodation | <span class="synType">varchar</span>(<span class="synConstant">60</span>) | YES | | <span class="synSpecial">NULL</span> | |
| <span class="synSpecial">access</span> | <span class="synType">varchar</span>(<span class="synConstant">100</span>) | YES | | <span class="synSpecial">NULL</span> | |
| memo | <span class="synType">varchar</span>(<span class="synConstant">100</span>) | YES | | <span class="synSpecial">NULL</span> | |
+<span class="synComment">--------------+--------------+------+-----+---------+-------+</span>
<span class="synConstant">7</span> <span class="synSpecial">rows</span> <span class="synStatement">in</span> <span class="synStatement">set</span> (<span class="synConstant"></span>.<span class="synConstant">00</span> sec)
mysql&#62; exit
Bye
</pre>
<h4>
perlスクリプト
</h4>
<p>
詳しくは参考リンクを見てください。
</p>
<pre class="syntax-highlight">
<span class="synComment"># === Libraries ===</span>
<span class="synStatement">use strict</span>;
<span class="synStatement">use warnings</span>;
<span class="synStatement">use </span>Data::Dumper;
<span class="synStatement">use </span>DBI;
<span class="synComment"># === Main part ===</span>
<span class="synComment"># データベースへの接続</span>
<span class="synStatement">my</span> <span class="synIdentifier">$dbh</span> = DBI-&#62;<span class="synStatement">connect</span>( <span class="synConstant">'dbi:mysql:dbname=sample'</span>, <span class="synConstant">'root'</span>, <span class="synConstant">'xxxxx'</span> );
<span class="synComment"># ステートメントハンドラの作成(=SQLをここで指定する)</span>
<span class="synStatement">my</span> <span class="synIdentifier">$sth</span> = <span class="synIdentifier">$dbh</span>-&#62;prepare(<span class="synConstant">&#34;select address from Shop&#34;</span>);
<span class="synComment"># ステートメントハンドラの実行(=SQLの実行)</span>
<span class="synIdentifier">$sth</span>-&#62;execute();
<span class="synComment"># ここでデータを取り出し、表示させる</span>
<span class="synStatement">while</span> (<span class="synStatement">my</span> <span class="synIdentifier">@row</span> = <span class="synIdentifier">$sth</span>-&#62;fetchrow_array ) {
<span class="synStatement">print</span> <span class="synConstant">&#34;</span><span class="synIdentifier">@row</span><span class="synSpecial">\n</span><span class="synConstant">&#34;</span>;
}
<span class="synComment"># ステートメントハンドラの解放</span>
<span class="synIdentifier">$sth</span>-&#62;finish;
<span class="synComment"># データベースハンドラの解放</span>
<span class="synIdentifier">$dbh</span>-&#62;disconnect;
</pre>
<h4>
実行結果
</h4>
<pre class="syntax-highlight">
kazu634@kazu634-desktop% perl mysql.pl ~/work/googlemaps <span class="synStatement">[</span><span class="synConstant">3081</span><span class="synStatement">]</span>
東京都豊島区東池袋<span class="synConstant">1-40-2</span>
東京都豊島区東池袋<span class="synConstant">1-42-8</span>
東京都豊島区巣鴨<span class="synConstant">1-15-1</span>
東京都文京区本郷<span class="synConstant">4-37-13</span>
東京都品川区大崎<span class="synConstant">1-6-4</span>
東京都中野区中野<span class="synConstant">5-61-2</span>
東京都中野区中野<span class="synConstant">5-67-5</span>
東京都中央区銀座<span class="synConstant">2-7-18</span>
東京都中央区銀座<span class="synConstant">2-5-5</span>
東京都中央区銀座<span class="synConstant">2-8-15</span>
東京都中央区銀座<span class="synConstant">2-11-6</span>
東京都中央区銀座<span class="synConstant">3-3-11</span>
東京都中央区銀座<span class="synConstant">6-12-10</span>
東京都中央区銀座<span class="synConstant">5-15-1</span>
東京都中央区日本橋<span class="synConstant">2-3-6</span>
東京都中央区日本橋本町<span class="synConstant">1-1</span>
東京都中央区八重洲<span class="synConstant">1-6-17</span>
東京都中央区八重洲<span class="synConstant">1-7-4</span>
東京都大田区大森北<span class="synConstant">1-1-10</span>
東京都大田区西蒲田<span class="synConstant">8-1-7</span>
東京都台東区上野<span class="synConstant">6-1-1</span>
東京都台東区上野<span class="synConstant">4-10-7</span>
東京都台東区上野<span class="synConstant">2-13-13</span>
東京都台東区谷中<span class="synConstant">7-20-6</span>
東京都千代田区五番町
東京都千代田区富士見<span class="synConstant">2-2-6</span>
東京都千代田区三崎町<span class="synConstant">3-6-13</span>
東京都千代田区内神田<span class="synConstant">2-9-9</span>
東京都千代田区内神田<span class="synConstant">3-21-8</span>
東京都千代田区鍛冶町<span class="synConstant">2-1-4</span>
東京都千代田区有楽町<span class="synConstant">1-6-1</span>
東京都千代田区外神田<span class="synConstant">1-16-10</span>
東京都千代田区外神田<span class="synConstant">1-11-6</span>
東京都千代田区神田佐久間町<span class="synConstant">1-18</span>
東京都杉並区阿佐ヶ谷南<span class="synConstant">2-14-10</span>
東京都杉並区高円寺北<span class="synConstant">2-4-4</span>
東京都新宿区西新宿<span class="synConstant">1-24-1</span>
東京都新宿区西新宿<span class="synConstant">1-17-1</span>
東京都新宿区西新宿<span class="synConstant">1-5-11</span>
東京都新宿区西新宿<span class="synConstant">7-23-2</span>
東京都新宿区新宿<span class="synConstant">2-19-1</span>
東京都新宿区新宿<span class="synConstant">3-4-1</span>
東京都新宿区市谷田町<span class="synConstant">1-3</span>
東京都新宿区四谷<span class="synConstant">1-3-22</span>
東京都新宿区歌舞伎町<span class="synConstant">1-3-5</span>
東京都新宿区歌舞伎町<span class="synConstant">1-14-4</span>
東京都新宿区歌舞伎町<span class="synConstant">1-26-6</span>
東京都新宿区西新宿<span class="synConstant">7-1-1</span>
東京都新宿区西新宿<span class="synConstant">7-9-7</span>
東京都新宿区百人町<span class="synConstant">1-18-8</span>
東京都新宿区百人町<span class="synConstant">2-11-25</span>
東京都新宿区高田馬場<span class="synConstant">2-18-6</span>
東京都新宿区高田馬場<span class="synConstant">2-14-2</span>
東京都新宿区高田馬場<span class="synConstant">1-34-8</span>
東京都新宿区高田馬場<span class="synConstant">1-34-12</span>
東京都渋谷区代々木<span class="synConstant">1-30-6</span>
東京都渋谷区千駄ヶ谷<span class="synConstant">1-30-8</span>
東京都渋谷区桜丘町<span class="synConstant">15-15</span>
東京都渋谷区渋谷<span class="synConstant">2-17-5</span>
東京都渋谷区宇田川町<span class="synConstant">36-2</span>
東京都渋谷区渋谷<span class="synConstant">1-16-14</span>
東京都荒川区西日暮里<span class="synConstant">5-23-6</span>
東京都荒川区東日暮里<span class="synConstant">5-51-11</span>
東京都港区赤坂<span class="synConstant">3-10-2</span>
東京都港区新橋<span class="synConstant">4-10-2</span>
東京都港区新橋<span class="synConstant">1-17-2</span>
東京都港区芝<span class="synConstant">5-34-7</span>
東京都港区芝大門<span class="synConstant">2-3-1</span>
東京都港区港南<span class="synConstant">2-3-29</span>
東京都港区高輪<span class="synConstant">3-25-22</span>
東京都江東区亀戸<span class="synConstant">2-20-7</span>
東京都葛飾区東金町<span class="synConstant">1-42</span>
東京都立川市柴崎町<span class="synConstant">3-4-14</span>
東京都立川市曙町<span class="synConstant">2-13-10</span>
東京都立川市曙町<span class="synConstant">2-9-1</span>
東京都武蔵野市中町<span class="synConstant">1-6-7</span>
神奈川県横浜市中区元町<span class="synConstant">1-18</span>
神奈川県横浜市中区港町<span class="synConstant">2-6</span>
神奈川県横浜市中区伊勢佐木町<span class="synConstant">2-66</span>
神奈川県横浜市鶴見区鶴見中央<span class="synConstant">1-3-3</span>
神奈川県鎌倉市小町<span class="synConstant">1-6-19</span>
神奈川県鎌倉市大船<span class="synConstant">1-7-1</span>
神奈川県川崎市川崎区駅前本町<span class="synConstant">3-3</span>
神奈川県川崎市川崎区砂子<span class="synConstant">1-1-10</span>
神奈川県足柄下郡箱根町湯本白石下<span class="synConstant">706-35</span>
埼玉県川越市脇田町<span class="synConstant">103</span>
千葉県市川市八幡<span class="synConstant">2-6-15</span>
</pre>
<h4>
参考
</h4>
<ul>
<li>
<a href="http://d.hatena.ne.jp/asin/4798119172" onclick="__gaTracker('send', 'event', 'outbound-article', 'http://d.hatena.ne.jp/asin/4798119172', 'モダンPerl入門 (CodeZine BOOKS)');">モダンPerl入門 (CodeZine BOOKS)</a>
</li>
<li>
<a href="http://www.rfs.jp/sb/perl/dbi/06.html#fetchrow_array" onclick="__gaTracker('send', 'event', 'outbound-article', 'http://www.rfs.jp/sb/perl/dbi/06.html#fetchrow_array', '第6章 DBI ステートメント・ハンドル');" target="_blank">第6章 DBI ステートメント・ハンドル</a>
</li>
<li>
<a href="http://paranoids.sakura.ne.jp/kaworu/2008-05-14-2.html" onclick="__gaTracker('send', 'event', 'outbound-article', 'http://paranoids.sakura.ne.jp/kaworu/2008-05-14-2.html', 'while (my @row = $sth-&#062;fetchrow_array ) { print &#034;@row¥n&#034;; }');" target="_blank">while (my @row = $sth->fetchrow_array ) { print "@row¥n"; }</a>
</li>
</ul>
<p>
</p>
<div class="hatena-asin-detail">
<a href="http://www.amazon.co.jp/dp/4798119172/?tag=hatena_st1-22&ascsubtag=d-7ibv" onclick="__gaTracker('send', 'event', 'outbound-article', 'http://www.amazon.co.jp/dp/4798119172/?tag=hatena_st1-22&ascsubtag=d-7ibv', '');"><img src="https://images-na.ssl-images-amazon.com/images/I/41W6wTHDSzL._SL160_.jpg" class="hatena-asin-detail-image" alt="モダンPerl入門 (CodeZine BOOKS)" title="モダンPerl入門 (CodeZine BOOKS)" /></a></p>
<div class="hatena-asin-detail-info">
<p class="hatena-asin-detail-title">
<a href="http://www.amazon.co.jp/dp/4798119172/?tag=hatena_st1-22&ascsubtag=d-7ibv" onclick="__gaTracker('send', 'event', 'outbound-article', 'http://www.amazon.co.jp/dp/4798119172/?tag=hatena_st1-22&ascsubtag=d-7ibv', 'モダンPerl入門 (CodeZine BOOKS)');">モダンPerl入門 (CodeZine BOOKS)</a>
</p>
<ul>
<li>
<span class="hatena-asin-detail-label">作者:</span> <a href="http://d.hatena.ne.jp/keyword/%CB%D2%C2%E7%CA%E5" onclick="__gaTracker('send', 'event', 'outbound-article', 'http://d.hatena.ne.jp/keyword/%CB%D2%C2%E7%CA%E5', '牧大輔');" class="keyword">牧大輔</a>
</li>
<li>
<span class="hatena-asin-detail-label">出版社/メーカー:</span> <a href="http://d.hatena.ne.jp/keyword/%E6%C6%B1%CB%BC%D2" onclick="__gaTracker('send', 'event', 'outbound-article', 'http://d.hatena.ne.jp/keyword/%E6%C6%B1%CB%BC%D2', '翔泳社');" class="keyword">翔泳社</a>
</li>
<li>
<span class="hatena-asin-detail-label">発売日:</span> 2009/02/10
</li>
<li>
<span class="hatena-asin-detail-label">メディア:</span> 大型本
</li>
<li>
<span class="hatena-asin-detail-label">購入</span>: 25人 <span class="hatena-asin-detail-label">クリック</span>: 534回
</li>
<li>
<a href="http://d.hatena.ne.jp/asin/4798119172" onclick="__gaTracker('send', 'event', 'outbound-article', 'http://d.hatena.ne.jp/asin/4798119172', 'この商品を含むブログ (113件) を見る');" target="_blank">この商品を含むブログ (113件) を見る</a>
</li>
</ul>
</div>
<div class="hatena-asin-detail-foot">
</div>
</div>
</div>