RubyのActiveRecords使ってRSSの中身をMySQLのDBに突っ込む
MISSION
rubyでrss取得してdbに突っ込むめに、activerecordsというgemを使って試す。
作業
Reference
http://www.rokurofire.info/2013/11/11/ruby_db/
Environment
vagrant上のboxで試します
Host
$ vagrant -v Vagrant 1.4.3
Guest
Vagrant box OS
14.10じゃないのはご愛嬌
$ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=14.04 DISTRIB_CODENAME=trusty DISTRIB_DESCRIPTION="Ubuntu 14.04 LTS"
chef-solo
vagrant boxにknife solo cookしたので、chef-soloが入ってる
$ chef-solo -v Chef: 12.0.3
mysql
$ mysql -V mysql Ver 14.14 Distrib 5.6.19, for debian-linux-gnu (x86_64) using EditLine wrapper
Work
必要な環境準備
*knife soloで入れたruby,gemを流用
$ sudo ln -sf /opt/chef/embedded/bin/gem /usr/bin/gem $ sudo ln -sf /opt/chef/embedded/bin/ruby /usr/bin/ruby $ ruby -v ruby 2.1.4p265 (2014-10-27 revision 48166) [x86_64-linux] $ gem -v 2.4.1
sudo aptitude install libmysqlclient-dev
- activerecord インストール
http://tsuchikazu.net/active_record_single_use/
$ sudo gem install mysql2 $ sudo gem install activerecord $ sudo gem install activerecord-import
mysqlのdb準備
文字コードはutf8に設定していることを前提にしてます
- ログイン
$ mysql -u root -p
- テストユーザー作成・権限付与
http://qiita.com/itkrt2y/items/4ea5bfe90ca65e4a9ebd
mysql>create user 'test user'@'localhost' identified by 'testpassword'; mysql> grant all on *.* to 'testuser'@'localhost';
- データベース作成
mysql> create database testdb; mysql> create table items( id integer NOT NULL AUTO_INCREMENT PRIMARY KEY, title VARCHAR(255) NOT NULL, link VARCHAR(500) NOT NULL, entrydate DATETIME NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- 作業用ディレクトリ作成
$ mkdir ~/work_dir $ cd ~/work_dir
- database.yml作成
mysqlDB接続情報を外出しして記述するためのファイル 以後作成するgetrss.rbと同じ階層に置く
db: development: adapter: mysql2 host: localhost username: testuser password: testpassword database: testdb
- getrss.rb
実際に使ってみよう
http://qiita.com/hiroki_y/items/23155a198f5e830e3e5a http://qiita.com/u1_fukui/items/88c10d4d530ec6fbaaa1
「ActiveRecord::Base 」で、ひもづけるテーブルを指定できる。 ActiveRecordの流儀で、
- テーブル名:複数形
- クラス名:単数 文頭大文字
としなきゃいけないらしい。。
クラス名は、先ほど作成したテーブル「items」と対応させ、 「Item」とする
require 'date' require 'rss' require 'mysql2' require 'active_record' require 'activerecord-import' require 'yaml' # database.ymlにDB接続情報を記述 # ActiveRecordを利用 config = YAML.load_file('./database.yml') # 「development」以下のdb情報を読み込み ActiveRecord::Base.establish_connection(config["db"]["development"]) # テーブルとひもづけるオブジェクト作成 class Item < ActiveRecord::Base # バリデーションの記述など validates_presence_of :title validates_presence_of :link validates_uniqueness_of :link end class ManageRss def getrss # Insert用の配列 insertData = [] # テストでSONYのRSSサイトを取得してみる lists = [ 'http://www.sony.co.jp/SonyInfo/News/Press/data/pressrelease_group.xml' ] return false unless lists #RSS1行ごとに処理をする lists.each do |rss| #xmlファイルをパース rssdata = RSS::Parser.parse(rss) begin rssdata.items.each do |entry| # dateの記述が間違っているRSSがたまにあるので念のため tmpdate = entry.respond_to?(:pubDate) ? entry.pubDate : entry.dc_date item = Item.new item.title = entry.title item.link = entry.link item.entrydate = tmpdate insertData << item end rescue => e # エラー時の処理 end end # BULK INSERT Item.import insertData return true end end
実行
ruby getrss.rb
テーブルに入ってるか確認
mysql> use testdb; mysql> select * from items; (中略) | 12 | [ソニー(株)]積層型CMOSイメージセンサーの生産能力を増強 | http://www.sony.co.jp/SonyInfo/News/Press/201502/15-009/ | 2015-02-02 06:00:00 | | 13 | [ソニー銀行]「ブラジルレアル預金フェア」実施のお知らせ(PDF) | http://sonybank.net/pdf/press150202.pdf | 2015-02-02 01:00:00 | | 14 | [ソニー生命]社長交代および執行役員人事について(PDF) | http://www.sonylife.co.jp/company/news/26/files/150130_jinji.pdf | 2015-01-30 06:00:00 | | 15 | [ソニーライフ・エイゴン生命]役員人事について(PDF) | http://www.aegonsonylife.co.jp/news_release/pdf/20150130.pdf | 2015-01-30 06:00:00 | | 16 | [ソネット/ソニーモバイルコミュニケーションズ]So-netのLTE通信とXperia™を組み合わせた新サービスの提供を開始 | http://www.sonymobile.co.jp/company/press/entry/2015/0130_1_so-net_lte.html | 2015-01-30 06:00:00 | | 17 | [ソニー(株)]Life Space UX 4K超短焦点プロジェクターを日本発売 | http://www.sony.jp/CorporateCruise/Press/201501/15-0129/ | 2015-01-29 04:00:00 | | 18 | [(株)ソニー・コンピュータエンタテインメント] 「プレイステーション ネットワーク」総合的なデジタルエンタテインメントブランドとして映像・音楽のサービスを統合(PDF) | http://www.scei.co.jp/corporate/release/pdf/150129a.pdf | 2015-01-28 23:00:00 | | 19 | [ソニー・ネットワークエンタテインメントインターナショナル] 【参考和訳】ソニー・ネットワークエンタテインメントインターナショナルとスポティファイ グローバルな戦略的提携を通じて、最高水準の音楽体験を「プレイステーション ネットワーク」で提供(PDF) | http://www.scei.co.jp/corporate/release/pdf/150129b.pdf | 2015-01-28 23:00:00 | | 20 | [ソニー(株)]ソニー株式会社 人事および機構改革 | http://www.sony.co.jp/SonyInfo/News/Press/201501/15-007/ | 2015-01-28 06:00:00 | | 21 | [ソニー(株)]2014年度第3四半期報告書の提出期限延長申請に係る承認のお知らせ(PDF) | http://www.sony.co.jp/SonyInfo/IR/news/20150127.pdf | 2015-01-27 08:00:00 | | 22 | [ソニー生命]プロフェッショナルに関する調査 | http://www.sonylife.co.jp/company/news/26/nr_150126.html | 2015-01-26 06:00:00 | | 23 | [ソニー(株)]2014年度第3四半期報告書の提出期限延長に関する承認申請書提出のお知らせ(PDF) | http://www.sony.co.jp/SonyInfo/IR/news/20150123.pdf | 2015-01-23 08:00:00 | | 24 | [ソニー(株)]さらなる高音質、小型化を実現したワイヤレスポータブルスピーカー 3機種発売 | http://www.sony.jp/CorporateCruise/Press/201501/15-0122/ | 2015-01-22 04:00:00 | | 25 | [ソニー(株)]ソニー、IIJなど4社がDSD™5.6MHzハイレゾ音源によるライブ配信の公開実験を実施 | http://www.sony.co.jp/SonyInfo/News/Press/201501/15-0122/ | 2015-01-22 01:00:00 | | 26 | [(株)ソニーコンピュータサイエンス研究所]オープンエネルギーシステム(OES)を実現する分散型DC電力制御に関する実証的研究の成果報告について | http://www.sony.co.jp/SonyInfo/News/Press/201501/15-0120/ | 2015-01-20 04:00:00 | | 27 | [ソニー生命]ライフプランニングに関する調査 | http://www.sonylife.co.jp/company/news/26/nr_150116.html | 2015-01-16 08:00:00 | | 28 | [ソニーライフ・エイゴン生命]世界リタイアメント意識調査結果のご報告(PDF) | http://www.aegonsonylife.co.jp/news_release/pdf/20150116.pdf | 2015-01-16 08:00:00 | | 29 | [ソニー(株)]ハイレゾ対応ウォークマン® ZXシリーズの最上位機種『NW-ZX2』を発売 | http://www.sony.jp/CorporateCruise/Press/201501/15-0115/ | 2015-01-15 04:00:00 | | 30 | [ソニー生命]「スペシャルオリンピックス日本」へ賛助金贈呈(PDF) | http://www.sonylife.co.jp/company/news/26/files/150114_so.pdf | 2015-01-14 06:00:00 |
以上