増子良太のブログです

増子良太が書いているブログです。テーマをしぼらず、思いついたものをただひたすら書いていきます。

いろんな言語でMySQLに接続してみよう

      2017/09/30

フリーランスプログラマーの増子です。

今までPerlを中心にお仕事をしてきて、Perlは嫌いだとか思ったことはないのだけれども、
色々な言語を知っていた方がこの先に役に立つのかなということもあったり、
お仕事で使うかもしれないので色々と勉強しているコードを公開しちゃいます。

まずは基本的なhello world。。。だとつまらないので、
いろんなプロジェクトでよく使われているMySQLに接続してしまいましょう。

データベースの作り方はここでは省略します。

  • データベース名:db
  • 接続テーブル名:author
  • 接続ユーザ名:user
  • 接続パスワード:password

※あくまでローカルの開発環境で説明しやすいように作りました。本番環境でこんなパスワードとか使っちゃダメ絶対!!

プログラムの内容は、authorテーブルに接続し、idとnameを表示するだけの簡単なお仕事。
言語ごとにどんな違いがあるのでしょうか。
楽しみですね。

さて、始めていきましょう!

Pythonの場合

PythonはPerlなんかと同じ動的言語と呼ばれるもので、コンパイルなどの作業をプログラマがやらずとも動いてくれる言語です。
楽チンですね。
インデントでプログラムの塊(関数の切れ目とかif文はどこまでだとか)を判断してくれるので、文章の終わりにセミコロン等は必要ありません。
どうしても1行に2つの命令を入れたい場合にはセミコロンで区切ることもできますが、読みにくくなるしやらない。

PythonからMySQLに接続するのみよく使われているのがMySQL-pythonというモジュールみたいです。
他にも色々あったり、Pythonのバージョンが2か3かで違ったりするので、自分がどのバージョンで使おうとしているのか事前に調べておきましょう。

今回はPython3系で説明します。

早速ソースコードを載せちゃいます。

見やすいように改行とか入れてますが、スマホとかだとちょっと見辛いかもしれません。

7行目:MySQLdb.connect()というところでdbに接続します。
8行目:カーソルを取得します。この時に、ハッシュでデータをもらいたいのでそのあたりもやってます。
11行目:sqlという変数に入っているSQL文を実行します。
12行目:fetchall()というところですべてのデータを配列で受け取ります。
14行目:受け取った配列をfor文で順番に取得して、printしています。
15、16行目:コネクションを閉じたり終わりの処理

15、16行目はwithとかで書くと入らなくなるらしいというかプログラムの実行が終わると自動的にコネクション閉じてくれそうなものだけど、最初なので丁寧に閉じるところまでやってみた。

つまずいたのは14行目で文字列を連結させてprintしていますが、idがintegerのため、『str()』で文字列に変換しています。
これをやらないと、書きエラーが発生します。

TypeError: cannot concatenate ‘str’ and ‘long’ objects

最近はMovableTypeもそうだし、他のフレームワークでも生のSQLを書くことがないので久しぶりに書きました。
ただのselect文なのに緊張するw

データベースへの接続ってもっとかかるかと思ったけど以外と簡単に行けた。

次行ってみよー

Rubyの場合

みんな大好きRuby on RailsのRubyです。

言語を作ったのは日本人(まつもと ひろゆき さん)が作ったので日本語の情報もいっぱいあっていいですね!
Perlは結構英語のサイトを読むことに。。。

RubyもPythonやPerlと同じくコンパイル作業が必要ない動的言語です。
そしてRubyもPythonと同じく文章の終わりにセミコロンなどが必要なしです。
if文などの塊はif〜endまでと日本人的にはわかりやすい形になってます。
少なくとも{{{}}}}あれ?カッコ一個多くない?みたいなことにはなりませんね。

RubyからMySQLに接続する場合には、mysql2というライブラリが最近は人気だとか。
流行りには乗っかるタイプなのでこちらでやってみたいと思います。

今回Railsはあえて使用しませんでした。
言語として比較したかったので、素のRubyです。

では早速ソースコード書いて見ましょう。

こちらもPythonとほぼ同じですね。
なるべく言語間で比較ができるように同じになるように書いているので当然といえば当然か。

Pythonよりスッキリしているのはカーソル周りの処理がないから。
ちょこっと調べた限りだとどこもこんな感じなので、どうなんでしょう?

細かいところだと、こちらもidをprintするときに文字列連結しているので『to_s』というメソッドを呼び出して文字列に変換しています。
これをやらないと、Pythonと同じようにエラーが発生します。

no implicit conversion of Fixnum into String (TypeError)

とりあえずRubyでも接続成功!

 

 - MySQL, データベース