使用 Ruby 連接數(shù)據(jù)庫(kù)
本章節(jié)讓我們學(xué)習(xí)如何用 Ruby 來(lái)連接數(shù)據(jù)庫(kù),最常用的數(shù)據(jù)庫(kù)是 Mysql,因此我們用 Mysql 來(lái)做為本章節(jié)的例子。
在安裝好Ruby的環(huán)境的基礎(chǔ)上,我們需要安裝 Ruby 連接 Mysql 的驅(qū)動(dòng) mysql2。
1. 安裝
1.1 安裝方式
在這里,我們通過(guò)安裝 mysql2 的 Gem 來(lái)實(shí)現(xiàn)。
gem install mysql2
1.2 配置選項(xiàng)
--with-mysql-dir[=/path/to/mysqldir]
:指定安裝 Mysql 的目錄,mysql2 的 gem 將不使用mysql_config
二進(jìn)制文件,而是查看mysqldir/lib
和``mysqldir/include作為庫(kù)和頭文件。該選項(xiàng)不可以和
–with-mysql-config`共同使用。--with-mysql-config[=/path/to/mysql_config]
:指定Mysql副本提供的二進(jìn)制文件mysql_config
的路徑,mysql2 將詢問(wèn)此二進(jìn)制文件有關(guān)編譯器和連接器的參數(shù)信息。該選項(xiàng)和--with-mysql-dir
不可共同使用。
2. 使用
2.1 連接數(shù)據(jù)庫(kù)
比如我們現(xiàn)在 Mysql 的用戶名是 root,無(wú)密碼。需要連接本地?cái)?shù)據(jù)庫(kù)。
實(shí)例:
require 'mysql2'
client = Mysql2::Client.new(:host => "localhost", :username => "root")
p client
# ---- 輸出結(jié)果 ----
#<Mysql2::Client:0x00007f8ae50200b8 @read_timeout=nil, @query_options={:as=>:hash, :async=>false, :cast_booleans=>false, :symbolize_keys=>false, :database_timezone=>:local, :application_timezone=>nil, :cache_rows=>true, :connect_flags=>2148540933, :cast=>true, :default_file=>nil, :default_group=>nil, :host=>"localhost", :username=>"root"}>
解釋:
連接上數(shù)據(jù)庫(kù)返回 mysql2 客戶端實(shí)例。
2.2 操作數(shù)據(jù)庫(kù)
執(zhí)行數(shù)據(jù)庫(kù)的一系列操作我們需要使用query
實(shí)例方法。
創(chuàng)建test_db
數(shù)據(jù)庫(kù)。
client.query("create database if not exists test_db character set UTF8mb4 collate utf8mb4_bin;")
創(chuàng)建一個(gè) students 表,里面有一個(gè)姓名、年齡字段。
client.query(%{
create table if not exists test_db.students(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(255),
age INT UNSIGNED,
PRIMARY KEY ( id )
);
})
向students
表中插入一條數(shù)據(jù):小明,10歲。
client.query("insert into test_db.students (name, age) values ('小明', 10);")
將students
表中小明的年齡更改為11歲。
client.query("update test_db.students set age = 11 where name = '小明';")
查看students的所有數(shù)據(jù),需要對(duì)結(jié)果進(jìn)行迭代。
results = client.query("select * from test_db.students;")
results.each do |result|
p result
end
# ---- 輸出結(jié)果 ----
{"id"=>1, "name"=>"小明", "age"=>11}
刪除name
等于小明的這一條數(shù)據(jù)。
client.query("delete from test_db.students where name = '小明';")
2.3 更多的鏈接選項(xiàng)
您可以在Mysql2::Client.new(...)
中設(shè)置以下連接選項(xiàng):
Mysql2::Client.new(
:host,
:username,
:password,
:port,
:database,
:socket = '/path/to/mysql.sock',
:flags = REMEMBER_OPTIONS | LONG_PASSWORD | LONG_FLAG | TRANSACTIONS | PROTOCOL_41 | SECURE_CONNECTION | MULTI_STATEMENTS,
:encoding = 'utf8',
:read_timeout = seconds,
:write_timeout = seconds,
:connect_timeout = seconds,
:connect_attrs = {:program_name => $PROGRAM_NAME, ...},
:reconnect = true/false,
:local_infile = true/false,
:secure_auth = true/false,
:ssl_mode = :disabled / :preferred / :required / :verify_ca / :verify_identity,
:default_file = '/path/to/my.cfg',
:default_group = 'my.cfg section',
:default_auth = 'authentication_windows_client'
:init_command => sql
)
了解更多請(qǐng)去mysql2官網(wǎng)中查看。
3. 小結(jié)
本章節(jié)我們學(xué)習(xí)了連接 Mysql 的一個(gè) Gem:mysql2,學(xué)習(xí)了如何使用它來(lái)建立 Ruby 與 Mysql 的連接。學(xué)習(xí)了使用 mysql2 來(lái)進(jìn)行簡(jiǎn)單的增刪改查(CRUD)操作,并了解了一些常見(jiàn)的配置項(xiàng)。