Ruby 連接MySQL數據庫
使用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數據庫