使用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数据库的更多相关文章

  1. 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 ...

  2. nodejs进阶(6)—连接MySQL数据库

    1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...

  3. PDO连接mysql数据库

    1.PDO简介 PDO(PHP Data Object) 是PHP 5 中加入的东西,是PHP 5新加入的一个重大功能,因为在PHP 5以前的php4/php3都是一堆的数据库扩展来跟各个数据库的连接 ...

  4. Windows操作系统下远程连接MySQL数据库

    用Eclipse做一个后台项目,但是数据库不想放在本地电脑,于是买了一个腾讯云服务器(学生有优惠,挺便宜的),装上MySQL数据库,但是测试连接的时候,发现总是连接不是上,但是本地数据库可以连接,于是 ...

  5. java 通过jdbc连接MySQL数据库

    先了解下JDBC的常用接口 1.驱动程序接口Driver 每种数据库的驱动程序都应该提供一个实现java.sql.Driver接口的类,简称Driver类.通常情况下,通过java.lang.Clas ...

  6. JDBC连接MySQL数据库代码模板

    下面这个例子是最简单的JDBC连接MySQL数据库的例子. 一般步骤: 1.注册驱动: 2.建立连接: 3.创建语句: 4.处理结果: 5.释放资源. 注意: 1.软件开发环境:MyEclipse 8 ...

  7. PHP如何连接MySQL数据库

    * PHP连接MySQL数据库 * 准备工作 * 在XAMPP软件的安装目录/php/ext目录中 * php_mysql.dll和php_mysqli.dll文件必须存在 * 在XAMPP软件的安装 ...

  8. JSP连接MySQL数据库问题

    之前写了一大段,还说了一下具体JDBC连接数据库API的具体包的基本知识,哪知道自己手残不小心按了删除按钮.结果去看自动保存记录时,就只剩下下面这段了.好吧,其实最主要最核心的也就是下面这点了.具体如 ...

  9. java连接mysql数据库详细步骤解析

    java连接mysql数据库详细步骤解析      第一步:下载一个JDBC驱动包,例如我用的是:mysql-connector-java-5.1.17-bin.jar      第二步:导入下载的J ...

随机推荐

  1. mvc4.0 @Styles.Render(转)

    1.@Styles.Render 在页面上可以用@Styles.Render("~/Content/css") 来加载css 首先要在App_Start 里面BundleConfi ...

  2. hibernate--CRUD初体验

    hibernate的crud操作初体验. 看具体实例 package com.fuwh.model; import javax.persistence.Column; import javax.per ...

  3. Struts2--二次提交

    在Struts2中,使用token的方式来防止二次提交.并且在默认的拦截器栈中提供了两个默认拦截器Token Interceptor和Token Session Interceptor.必须要在for ...

  4. [COGS 2401]Time is Money

    Description 题库链接 给你 \(n\) 个节点 \(m\) 条边的无向连通图.每条边有两个权值 \(c,t\) ,要你生成一棵边集为 \(\mathbb{E}\) 的生成树使得 \[\su ...

  5. Codeforces Round #460 D. Karen and Cards

    Description Karen just got home from the supermarket, and is getting ready to go to sleep. After tak ...

  6. poj 3348 Cow 凸包面积

    Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8122   Accepted: 3674 Description ...

  7. 【NOIP2017 OFO(下)】

    ·我不知道对不对,只是不想让大米兔就这样离开.      by tkys_Austin;                    [另一只情绪化的兔子]        今年的11月12日NOIP提高组, ...

  8. 伸展树Splay【非指针版】

    ·伸展树有以下基本操作(基于一道强大模板题:codevs维护队列): a[]读入的数组;id[]表示当前数组中的元素在树中节点的临时标号;fa[]当前节点的父节点的编号;c[][]类似于Trie,就是 ...

  9. [APIO2010]

    A.特别行动队 n<=1000000 看了数据范围和题目感觉就像是斜率优化,然后瞎推了一波式子,没想到A了. sij表示i+1到j的权值和. j比k优秀  $$fj+a*sij^{2}+b*si ...

  10. Redis实现单点登录

    http://blog.csdn.net/WuCourage/article/details/77802812