1. 程式人生 > >Ruby 連接MySQL數據庫

Ruby 連接MySQL數據庫

mysql mat eas wol 結果 run mar ats blog

使用Ruby連接數據庫的過程還真的是坎坷,於是寫點文字記錄一下。

    • 簡介
      • Ruby簡介
      • RubyGems簡介
        • 包管理之道
        • 比較著名的包管理舉例
      • 細說gem
        • 常用的命令
    • 準備
      • 驅動下載
        • dbi
        • mysql
        • mysql2
        • MySQL的CC連接器
      • 測試環境
    • 代碼測試
      • 連接數據庫
      • CRUD
        • Select
        • Delete
        • Update
        • Insert
      • 仿PreparedStatement
        • 假冒偽劣版
        • 假冒偽劣進階版
      • 處理結果集
        • 表結構
        • 結果集遍歷
    • 總結

簡介

Ruby簡介

Ruby是一種純粹的面向對象編程語言。它由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)創建於1993年······

簡介就介紹到這麽多了,反正也沒人願意看這些文字。下面著重講下一個小結。

RubyGems簡介

包管理之道

在說RubyGems之前,我們來談一談關於包管理。在沒有包管理軟件之前,我們要想完成一個庫或者軟件的安裝,要處理好這些東西之間的依賴以及版本關系等等,總之,對於新手而言,這無疑是加大了學習的曲線。而包管理的誕生,把我們從繁瑣復雜的安裝過程中解放了出來。

比較著名的包管理舉例

  • 作為一個程序員,想必都接觸過Linux系統,在其之上的包管理軟件也有很多,比如Ubuntu的apt-get,Redhat的rpm,yum;Debian系列的dpkg等等;

  • 或者Node.js語言的npm;

  • Python 的easy_install 或者久負盛名的pip

  • 還有今天我們要說的Ruby 中的gem

細說gem

Gem 是 Ruby 模塊 (叫做 Gems) 的包管理器。其包含包信息,以及用於安裝的文件。

其原理是:

Gem通常是依照”.gemspec”文件構建的,包含了有關Gem信息的YAML文件。Ruby代碼也可以直接建立Gem,這種情況下通常利用Rake來進行。

常用的命令

gem命名和Python的pip很相似,其實大部分的包管理使用起來都很類似,現簡要的介紹一下吧。

  • 安裝

    gem install mygem

  • 卸載

    gem uninstall mygem

  • 列出已經安裝的gem

    gem list –local

  • 列出可用的gem

    gem list –remote

  • 為所有的gems創建RDoc文檔

    gem rdoc -all

  • 下載一個gem,但不安裝

    gem fetch mygem

  • 從可用的gems中搜索gem

    gem search STRING –remote

準備

要想使用Ruby連接數據庫,我們就需要跨進程操作了。所以我們必須借助驅動來完成這兩個工作模式完全不同的進程。那麽,交給驅動來解決這個問題吧。

驅動下載

連接MySQL數據庫,常見的幾種方式如下。

dbi

技術分享圖片

這就是DBI的工作原理,我們只需要調用封裝好了的API就可以實現對不同數據庫的操作,這對於移植來說會很方便。

Administrator@WIN-5APATS8G3U6 MINGW64 /d/Software/ruby/Ruby23-x64/lib/ruby/gems/2.3.0/gems
$ gem install dbi
Successfully installed dbi-0.4.5
Parsing documentation for dbi-0.4.5
Done installing documentation for dbi after 1 seconds
1 gem installed

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

如此便成功安裝了DBI模塊。具體參照DBI 模塊

mysql

不巧的是,我在安裝mysql模塊的時候出現了下面的這些個問題。根據錯誤提示我們需要使用dev工具來安裝才行,但是mysql模塊安裝不成功並不影響我們對數據庫的操作,所以這個問題就先放放一放吧。

$ gem install mysql
ERROR:  Error installing mysql:
        The ‘mysql‘ native gem requires installed build tools.

Please update your PATH to include build tools or download the DevKit
from ‘http://rubyinstaller.org/downloads‘ and follow the instructions
at ‘http://github.com/oneclick/rubyinstaller/wiki/Development-Kit‘
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

mysql2

Ruby 連接 Mysql 更高效的驅動 mysql2,目前也推薦使用這種方式連接 MySql。
安裝過程同樣是很簡單。

gem install mysql2

$ gem install mysql2

Successfully installed mysql2-0.4.4-x64-mingw32
Parsing documentation for mysql2-0.4.4-x64-mingw32
Done installing documentation for mysql2 after 0 seconds
1 gem installed
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

MySQL的C/C++連接器

libmysql.dll 文件是MySQL的動態鏈接庫文件,缺少此文件數據庫無法正常工作。將這個文件 拷貝到 Ruby/Bin目錄中,或者C:\windows\system32目錄也可。

下載地址

點擊msi版本的安裝即可。

測試環境

基本上準備工作完成了,下面說一下我的實驗環境。

  • OS: Windows 7 旗艦版
  • Ruby版本: ruby 2.3.1p112 (2016-04-26 revision 54768) [x64-mingw32]
  • IDE: RubyMine 2016.2
  • MySQL版本: MySQL 5 .7

代碼測試

下面真正開始使用Ruby操作MySQL數據庫。根據Unix思想“做一件事,就用最好的方式,做到最好”,於是下面我就采用mysql2模塊來操作了。

連接數據庫

首先是連接數據庫。如下:

require ‘mysql2‘

client = Mysql2::Client.new(
    :host     => ‘127.0.0.1‘, # 主機
    :username => ‘root‘,      # 用戶名
    :password => ‘123456‘,    # 密碼
    :database => ‘test‘,      # 數據庫
    :encoding => ‘utf8‘       # 編碼
    )
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

裏面的值視自己的情況而定。

CRUD

使用Ruby操作數據庫實現增刪改查也是很方便的一件事,至少和Python一樣簡潔。

Select

require ‘mysql2‘

client = Mysql2::Client.new(
    :host     => ‘127.0.0.1‘, # 主機
    :username => ‘root‘,      # 用戶名
    :password => ‘mysql‘,    # 密碼
    :database => ‘fams‘,      # 數據庫
    :encoding => ‘utf8‘       # 編碼
)

result = client.query("Select * from dog")
result.each do |item|
  puts "In row :#{item[‘id‘]} the dog‘s name is :#{item[‘name‘]}"
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

獲得的結果如下:

D:\Software\ruby\Ruby23-x64\bin\ruby.exe -e $stdout.sync=true;$stderr.sync=true;load($0=ARGV.shift) E:/Code/ruby/helloworld/hello.rb
{"VERSION()"=>"5.7.13-log"}
In row :1 the dog‘s name is :lachang
In row :2 the dog‘s name is :hashiqi
In row :3 the dog‘s name is :samoyed
In row :4 the dog‘s name is :wolf

Process finished with exit code 0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

Delete

require ‘mysql2‘

client = Mysql2::Client.new(
    :host     => ‘127.0.0.1‘, # 主機
    :username => ‘root‘,      # 用戶名
    :password => ‘mysql‘,    # 密碼
    :database => ‘fams‘,      # 數據庫
    :encoding => ‘utf8‘       # 編碼
)

client.query("delete from dog where id = 5")
result = client.query("Select * from dog")

result.each do |item|
  puts "In row :#{item[‘id‘]} the dog‘s name is :#{item[‘name‘]}"
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

結果如下:

In row :1 the dog‘s name is :lachang
In row :2 the dog‘s name is :hashiqi
In row :3 the dog‘s name is :samoyed
In row :4 the dog‘s name is :wolf
  • 1
  • 2
  • 3
  • 4

Update

require ‘mysql2‘

client = Mysql2::Client.new(
    :host     => ‘127.0.0.1‘, # 主機
    :username => ‘root‘,      # 用戶名
    :password => ‘mysql‘,    # 密碼
    :database => ‘fams‘,      # 數據庫
    :encoding => ‘utf8‘       # 編碼
)

client.query("update dog set name=‘郭璞‘ where id = 2")
result = client.query("Select * from dog")

result.each do |item|
  puts "In row :#{item[‘id‘]} the dog‘s name is :#{item[‘name‘]}"
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

獲得的結果為:

In row :1 the dog‘s name is :lachang
In row :2 the dog‘s name is :郭璞
In row :3 the dog‘s name is :samoyed
In row :4 the dog‘s name is :wolf
  • 1
  • 2
  • 3
  • 4

Insert

require ‘mysql2‘

client = Mysql2::Client.new(
    :host     => ‘127.0.0.1‘, # 主機
    :username => ‘root‘,      # 用戶名
    :password => ‘mysql‘,    # 密碼
    :database => ‘fams‘,      # 數據庫
    :encoding => ‘utf8‘       # 編碼
)

client.query("insert into dog(name) values(‘哈士奇‘)")
result = client.query("Select * from dog")

result.each do |item|
  puts "In row :#{item[‘id‘]} the dog‘s name is :#{item[‘name‘]}"
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

處理結果為

In row :1 the dog‘s name is :lachang
In row :2 the dog‘s name is :hashiqi
In row :3 the dog‘s name is :samoyed
In row :4 the dog‘s name is :wolf
In row :5 the dog‘s name is :哈士奇
  • 1
  • 2
  • 3
  • 4
  • 5

仿PreparedStatement

用過JDBC的PreparedStatement的API的都知道其好處,所以我們在這裏要模擬一下。

“假冒偽劣版”

name = "CSDN 博客小劄"
client.query("update dog set name=‘"+name+"‘ where id = 2")
result = client.query("Select * from dog")
  • 1
  • 2
  • 3

“假冒偽劣進階版”

或者這樣的:

name = "CSDN 博客小小劄"
client.query("update dog set name=‘#{name}‘ where id = 2")
result = client.query("Select * from dog")
  • 1
  • 2
  • 3

實際上我們不難看出,其還是對SQL語句的拼湊,並不是真正的Prepared方式。所以在書寫sql語句的時候要格外用心啊。

處理結果集

其實在上面的CRUD操作中我們就可以看到。我們經常采用遍歷操作來獲取結果集中的詳細信息。我們在操作的時候一定是需要知道結果集中的數據字段信息的,這樣才能較好的實現我們的需求。

表結構

本例中表結構的詳細信息為:

mysql> desc dog;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(10)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(30) | NO   |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.12 sec)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

結果集遍歷

result.each do |item|
  puts "In row :#{item[‘id‘]} the dog‘s name is :#{item[‘name‘]}"
end
  • 1
  • 2
  • 3

如此即可,遵守其規則之後,我們也會發現,不過如此了。

總結

對於Ruby而言,貌似真的是不太適合在Windows下學習,畢竟資料方面真的是太少了。而且有很多操作沒有相關的命令,也讓人很沮喪。不過我相信,只要用心學,就能學好Ruby的。

與君共勉 :-)

再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!https://blog.csdn.net/jiangjunshow

Ruby 連接MySQL數據庫