Ruby 连接MySQL数据库
使用Ruby连接数据库的过程还真的是坎坷,于是写点文字记录一下。
简介
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
如此便成功安装了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'
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
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' # 编码
)
里面的值视自己的情况而定。
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
获得的结果如下:
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
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
结果如下:
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
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
获得的结果为:
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
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
处理结果为
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 :哈士奇
仿PreparedStatement
用过JDBC的PreparedStatement的API的都知道其好处,所以我们在这里要模拟一下。
“假冒伪劣版”
name = "CSDN 博客小札"
client.query("update dog set name='"+name+"' where id = 2")
result = client.query("Select * from dog")
“假冒伪劣进阶版”
或者这样的:
name = "CSDN 博客小小札"
client.query("update dog set name='#{name}' where id = 2")
result = client.query("Select * from dog")
实际上我们不难看出,其还是对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)
结果集遍历
result.each do |item|
puts "In row :#{item['id']} the dog's name is :#{item['name']}"
end
如此即可,遵守其规则之后,我们也会发现,不过如此了。
总结
对于Ruby而言,貌似真的是不太适合在Windows下学习,毕竟资料方面真的是太少了。而且有很多操作没有相关的命令,也让人很沮丧。不过我相信,只要用心学,就能学好Ruby的。
与君共勉 :-)
Ruby 连接MySQL数据库的更多相关文章
- ruby使用DBI连接MySQL数据库发生异常:in `error': Can't connect to MySQL server on 'localhost' (10061) (DBI::DatabaseError)
Ruby使用DBI连接MySQL数据库一般为: require "dbi" dbh = DBI.connect("dbi:Mysql:test:localhost&quo ...
- nodejs进阶(6)—连接MySQL数据库
1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...
- PDO连接mysql数据库
1.PDO简介 PDO(PHP Data Object) 是PHP 5 中加入的东西,是PHP 5新加入的一个重大功能,因为在PHP 5以前的php4/php3都是一堆的数据库扩展来跟各个数据库的连接 ...
- Windows操作系统下远程连接MySQL数据库
用Eclipse做一个后台项目,但是数据库不想放在本地电脑,于是买了一个腾讯云服务器(学生有优惠,挺便宜的),装上MySQL数据库,但是测试连接的时候,发现总是连接不是上,但是本地数据库可以连接,于是 ...
- java 通过jdbc连接MySQL数据库
先了解下JDBC的常用接口 1.驱动程序接口Driver 每种数据库的驱动程序都应该提供一个实现java.sql.Driver接口的类,简称Driver类.通常情况下,通过java.lang.Clas ...
- JDBC连接MySQL数据库代码模板
下面这个例子是最简单的JDBC连接MySQL数据库的例子. 一般步骤: 1.注册驱动: 2.建立连接: 3.创建语句: 4.处理结果: 5.释放资源. 注意: 1.软件开发环境:MyEclipse 8 ...
- PHP如何连接MySQL数据库
* PHP连接MySQL数据库 * 准备工作 * 在XAMPP软件的安装目录/php/ext目录中 * php_mysql.dll和php_mysqli.dll文件必须存在 * 在XAMPP软件的安装 ...
- JSP连接MySQL数据库问题
之前写了一大段,还说了一下具体JDBC连接数据库API的具体包的基本知识,哪知道自己手残不小心按了删除按钮.结果去看自动保存记录时,就只剩下下面这段了.好吧,其实最主要最核心的也就是下面这点了.具体如 ...
- java连接mysql数据库详细步骤解析
java连接mysql数据库详细步骤解析 第一步:下载一个JDBC驱动包,例如我用的是:mysql-connector-java-5.1.17-bin.jar 第二步:导入下载的J ...
随机推荐
- C#之IComparable用法,实现List<T>.sort()排序
这篇文章主要介绍了C#的一些基础知识,主要是IComparable用法,实现List<T>.sort()排序,非常的实用,这里推荐给大家. List<T>.sort()可以 ...
- pyqt5 动画学习(一) 改变控件大小
入坑pyqt也有半年了,由于人们对事物的审美,静态界面已经不能满足用户,而动画却给人眼前一亮,so,今天来学习pyqt的动画了 由于资料真的是太少,本人也是有啃外国佬的英文进行摸索学习,可能也是触及皮 ...
- MySQL的安全机制
MySQL的安全机制: 1.MySQL登录 mysql -u账户 -p密码 -h127.0.0.1 -P端口 数据库名 mysql -h hostname|hostIP -p port -u user ...
- java开发----自定义对象,重写equals方法
javaweb开发中,用到了好多自定义对象,这时候如果不重写equals方法,很多时候都会返回false, 因此我们必须习惯重写这个方法. 重点: 1.equals比较俩对象时比较的是对象引用是否指向 ...
- Discuz 5.x 6.x 7.x 前台SQL注入漏洞
来源:http://wooyun.jozxing.cc/static/bugs/wooyun-2014-071516.html 漏洞出现在/include/editpost.inc.php. if($ ...
- [HNOI 2018]排列
Description 题库链接 给定 \(n\) 个整数 \(a_1, a_2, \dots, a_n, 0 \le ai \le n\) ,以及 \(n\) 个整数 \(w_1, w_2, \do ...
- [HAOI 2007]理想的正方形
Description 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. Input 第一行为3个整数,分别表示a,b,n的值第二行至第 ...
- 【HDU 2966 k-dimensional Tree 入个门】
·“k-d树是一种分割k维数据空间的数据结构.主要应用于多维空间关键数据的范围搜索和最近邻搜索……”’' ·英文题,述大意: 给出平面内n个点(n<=100000,0<=x, ...
- 容器化分布式日志组件ExceptionLess的Angular前端UI
写在前面 随着微服务架构的流行,日志也需要由专门的分布式日志组件来完成这个工作,我们项目使用的是 ExceptionLess 这个组件,它是前后端分离的:这篇文章我们就来实践容器化 Exception ...
- Python中的变量类型
原文传送门:点击