一、使用Migrations管理数据表
在Rails中,当创建一个叫contact的model时,同时一个名为contacts的数据表将会被创建。因此,对数据表contacts的操作可以转换成对模型contact操作,可以访问它的属性。而很多的新手习惯使用一些框架什么的来操作数据表,其实,可以通过Rails本身提供的功能就可以操作数据表了。这样的功能就是Migrations功能。
多数Rails开发者使用Migrations迁移的基本功能来创建和管理数据库。数据迁移功能让你可以使用Ruby语言来管理数据库方案,可以充分利用一些Ruby所特有的工具,诸如Rake,来根据Ruby脚本提供的指令来更新数据库。还有,数据迁移功能还具有一个内置的版本控制功能,可以像在Subversion或CVS中那样对所做的修改进行前后的回滚。听起来是不是很具有诱惑力呢?
Migrations有点像活动记录(Active Record,一个对象,它包装数据库表或视图中的某一行,封装数据库访问,并在这些数据上增加了领域逻辑),可以通过Migrations进行程序形式的管理数据表,即可以创建、修改、删除表格,而且语法很简单。更重要的是,Migrations提供了一个构建的控制器。
事实上,当在Rails下创建一个新的model时,会自动的创建Migration文件。例如,创建一个contact模型时,在项目的db目录下,即可发现一个名为001_create_contacts.rb的文件,其内容如下所示:
class CreateContacts < ActiveRecord::Migration
def self.up
create_table :contacts do |t|
end
end
def self.down
drop_table :contacts
end
end
如果想要创建数据表,可以把以上内容修改成如下内容:
class CreateContacts < ActiveRecord::Migration
def self.up
create_table :contacts do |t|
t.column :name, :string, :null => false
t.column :email, :string
t.column :phone, :string, :limit => 10, :null => false
end
end
def self.down
drop_table :contacts
end
end
现在可以使用Migration功能了,在项目的目录下运行如下的Rake命令:
%>rake db:migrate
现在登陆MySQL数据库中,可以看到,contacts表已经创建好了。那么,如果想撤消刚才的创建要怎么办呢?要回滚上面的操作可以使用VERSINO选项。因为数据移植功能的工作原理与版本控制工具很相似,你可以将数据库回滚到一个早期的版本。版本号是由数据移植脚本所提供的数字来确认的:
%>rake db:migrate VERSION=0
再次登陆MySQL数据库,可以看到contacts表已经删除掉了。此外,如果想进行其它一些更加复杂的操作时,自然而然想到通过创建另一个migrations。例如,想另外创建一张表,或修改字段的数据类型等。可能在项目的目录下运行如下的代码来创建一个新的migration文件:
%>ruby script/generate migration your_desired_migration_name
二、从Fixture中加载数据
在创建一个应用程序时,我们往往遇到这样的情况,手边已经有了一些数据,需要将这些现成的数据融合到应用程序的数据库中去。例如,在进行客户的结帐时,往往需要询问客户,以确定他们居住在哪个州。因为州名可能在程序中很多地方使用到,于是就有必要创建一个名为state的model。但这里又不想手工的创建这样的表格,因为这样做不只是很烦琐,更重要的是可能导致错误。
这个时候,就可以使用fixtures这一功能了。它最初的目的,是为了在进行程序测试时,简化从示例数据向测试数据的转换工作。Fixture是包含运行测试时使用数据的文件。但是,稍微加工一下,我们也可使用它们在migration迁移期间来加载数据。
但后来的事实证明,这是一种很不错的方法,可以使用种子数据生成测试的Model,例如前面所提到的州名。所需要做的工作就是把数据按照fixtures的格式进行组织,这里的格式要求有两点:YAML(YAML Ain't Markup Language,这是一种数据序列化(serialization)语言,是一种可读的文本的数据结构,它的设计目标是使人们容易读,程序容易处理。它类似XML,但是比XML简单)及comma-separated(逗号分隔)。
下面将展示如何通过逗号分隔的fixture文件,用于保存州名,并且使用Rake来生成包含这些数据的数据表。这是假定读者已经创建了state model及migration文件,接下来生成数据表。
首先,请记住Rails的编辑习惯,因此这里应该在项目的test/fixtures目录下创建我们的fixtures,因为这些数据最主要的用途还是用来进行测试。当然了,在项目的db目录下面还可以创建seed目录,用于存放种子数据。
然后,创建state.csv文件,并存放在db/seed目录下面。该文件的内容如下:
id, name, abbreviation
1, Alabama, AL
2, Alaska, AK
3, Arizona, AZ
4, Arkansas, AR
5, California, CA
6, Colorado, CO
接下来,需要创建一个Rake文件,至于这一点,要想完全讲清楚,没有一篇比较长的文章很难。因此在这里不进行具体的解释,只列出步骤。创建seeder.task文件,并将它存放在项目的lib/tasks目录下面,该文件的内容如下所示:
namespace :db do
desc "Load seed fixtures (from db/seed) into the current
environment's database."
task :seed => :environment do
require 'active_record/fixtures'
Dir.glob(RAILS_ROOT + '/db/fixtures/*.csv').each do |file|
Fixtures.create_fixtures('db/seed',
File.basename(file, '.*'))
end
end
end
为了生成states数据表,需要在项目的目录下执行如下的命令:
%>rake db:seeder
登陆MySQL数据库服务器,检查数据库,表已经创建好了。
三、在数据库之间迁移数据
Rails的开发者Tobias Lutke遇到了数据迁移的问题,他采用Rake任务将数据库中的数据生成YAML格式的文件,再通过Rails的Migrations功能来生成其它数据库(包括MySQL、SQLite、SQL Server以及Oracle)。在这里,不列出具体的代码,因为很长,只列出一些关键的命令就可以了。
执行下面的命令,把数据库中的数据生成YAML格式:
%>rake db:backup:write
于是,数据库中的所有表都备份到了db/backup目录中了。接下来要做的就是修改database.yml文件,以指向接收数据的数据库。并运行如下的命令:
%>rake db:backup:write
四、小结
作为一个Rails开发者,你可能熟练得运用“rake”运行你的测试,或者你利用“rake db:migrate”运行你的数据迁移任务(migration)。但是,你是否真正明白在那些Rake任务的背后发生了什么吗?你是否意识到,你可以编写属于你的任务,或者创建好用的属于你的Rake库文件?
本文只是介绍了Rails的数据管理功能的冰山一角,事实上,它不仅支持MySQL,还支持目前市面上的大多数数据库,诸如SQLite、PostgreSQL、SQL Server和Oracle。如果读者想了解更多这个精彩工具的功能,可以去查看Rails的官方站点的migrations documentation(http://api.rubyonrails.org/classes/ActiveRecord/Migration.html)。
分享到:
相关推荐
找不到指定的模块。... 您可能感兴趣的文章:Ruby rails 页面跳转(render和redirect_to)Rails link_to 详解rails常用数据库查询操作、方法浅析学习Ruby你需要了解的相关知识(rvm, gem, bundle, rake,
添加 Rake 命令以转储和恢复应用程序的数据库。 委托常规转储实用程序,例如mysqldump和pg_dump 。 与它们不同的是,您不必记住任何正确的语法。 您也不必指定连接参数; 如果应用程序工作,转储程序也工作。 ...
Redmine 是一个基于 Web 的项目管理工具,使用 Ruby on Rails 框架开发,需要特定的 Ruby 和 Rails 版本。下面是安装 Redmine 和 Apache2 的详细步骤。 一、安装 Redmine 需要的 Ruby 和 Rails 版本 Redmine 需要...
罗斯文路轨 是否曾经想过在一个不错的数据库上使用ActiveRecord? 现在,您可以使用Northwind来了解Rails的查询语法。... 运行位于db / northwind.sql的sql dump(它是为MySQL设计的) rails server
MySQL,PostgreSQL或SQLite 在模型中需要一个时间戳字段(例如created_at或updated_at),并在上面带有数据库索引 变更日志 安装 步骤1:将其添加到您的Gemfile中: gem 'unread' 并运行 bundle 步骤2:生成并...
Baukis -客户管理系统 说明 Baukis 是一个面向企业的客户管理系统(学习 Ruby on Rails 的示例)。 系统要求 CentOS 6.5 或 Ubuntu 14.04 Ruby 2.1.2 ... 运行 RAILS_ENV = production bin / rake db:
#招生计划科廷大学计算机课程招生规划师###运行应用程序所需的软件/程序: Ruby + Rails 框架MySQL数据库###开发环境设置:如果这是您第一次运行应用程序,请按照以下步骤设置应用程序环境: 设置数据库(用户名、...
MySQL、PostgreSQL 和 Sqlite 的简单解决方案。 它如何帮助您? 当您想检查开发或生产数据库中的某些内容而不想运行 console.log 时,您知道这种情况吗? 那是使用 DB Explorer 的正确时机:) 我知道,有类似的...
安装初始化mysql数据库 rake db:create rake db:migrate rake db:seed 启动3000端口 rails s 访问前台 账号: 密码:11111111 访问后台 账号: 密码:11111111 创建一个类 数据表创建: rails g migration create_...
数据库mysql或mariadb 记忆快取 延迟工作 发展 所有依赖项都包装在docker中。 可以使用bash bin/run-tests-with-docker.sh运行测试。 这与CI中使用的命令相同。 如果要在bash bin/rails-dev-run.sh wrestlingapp-...
或在您的本地环境中: 设置Ruby和Rails环境后(您可以在此处找到详细信息: : )并运行MySQL服务器(您可以在此处找到详细信息: ),然后: 运行rake db:create (在您的命令行中) 运行rake db:seed (在项目中...
这是应用程序中使用的一些关键组件的列表: (Web框架) (对象关系数据库) (JavaScript框架) (标记) (Rails文件上传) (基本CSS /设计)设置要求: Ruby(> = 1.9.3) Postgresql(SQLite或MySQL也会在一定...
创新实验室管理系统一期工程(cxlab)如何安装源代码首先,你需要自行安装好rails开发环境。所有软件的版本如下:ruby 2.0及以上gem 2.4及以上rails 4其次,在gitlab中fork我们的资源库 然后,运行下面的命令克隆这...
版本: Ruby 2.6.3 导轨5.2.3 MySQL 8.0.17 本地使用在本地路径中克隆此项目使用devel login / passwd配置mysql:根:根@本地主机(dbs / config.rb中的conf) 创建表和数据以使用rake进行测试: 耙数据库:创建耙...
Rails新的audioverb -d mysql rails g基础:安装rake db:创建rails g主干:安装rails g model Lng lng:string cod:string rails g model Voc voc:string freq:float gram:integer lng_id:integer rank:...
交换用于创建,共享和重用学习资源的数字平台–来自多种资源的资产资源集合预先设定弹性搜索在启动应用程序之前,请确保您具有 up + running,因为我们依靠它来进行... 接下来,运行$ rake db:migrate RAILS_ENV=deve
MySQL 中的 Archimist 1.2.1 数据库> = 5.1 为 Rails 应用程序配置的 Web 服务器 安装 为数据库创建一个配置文件:config/database.yml。 安装 Rails 依赖项: bundle install 激活文本搜索引擎: rake ts:...
MySQL Ruby 2.0.0 Gemfile 上的宝石 项目设置和执行: 安装依赖和下载项目后,打开终端,进入下载的项目目录,使用命令安装必要的Gems $ bundle install 使用命令创建数据库 $ bundle exec rake db:create db:...
Newjq jQuery插件集合网站要求Ruby 2.2.0以上Rails 4.2.0 MySQL 5.0以上ImageMagick 6.5+安装克隆项目$ git clone git@github.com:awesomes-cn/newjq.git 创建一个mysql数据库并迁移$ rake db:migrate初始化一些数据...
============================== C:\>rails foobar -d mysql C:\>cd foobar C:\foobar>ruby script/generate scaffold article title:string content:text 此时设置一下数据库(C:\foobar\config\database.yml),...