写道
标题: 使用Rails 数据库DSL与PHP协作开发
作者: 色色
博客: http://vb2005xu.iteye.com
日期: 2009年10月27日
十一了解了rails,特别喜欢上了其中的rake db:migrate 指令,我并不是Rails程序员,而是PHP程序员.
在之后的项目中,我使用了Rails的数据库DSL来构建和管理项目中的MYSQL数据库,以下简要的描述些语法.
1. 了解RAILS DB DSL定义的数据类型与MYSQL数据库的数据类型是最重要的
Rails Migration Symbol | MySQL Data Type
:binary blob
:boolean tinyint(1)
:date date
:datetime datetime
:decimal decimal
:float float
:integer int(11)
:string varchar(255)
:text text
:time time
:timestamp datetime
2. 熟悉rails常用命令,关于RAILS环境搭建,见我上篇文章.
1. rails sdo_todo 生成一个项目
2. 在生成的文件夹sdo_todo下建立一个批处理文件open-console.bat,内容为:
cmd
此文件用于方便之后使用终端命令时可以自动切入到此目录下
修改其下的config\database.yml文件,里面换成你的数据库的链接属性
3. 运行open-console.bat文件,在打开的DOS提示符中输入
ruby script\generate migration CreateCategories
来创建分类数据表骨架代码,它将会在db\migrate\20091022065038_create_categories.rb文件,
文件名最前面的是此文件的创建时间戳,用于数据库迁移的,暂时不用管它,知道就行
4. 编辑 20091022065038_create_categories.rb 文件,内容如下所示:
class CreateCategories < ActiveRecord::Migration
def self.up
create_table :categories do |t|
# 父分类 id
t.column :parent_id, :integer, :limit => 11, :null => false
# 分类名称
t.column :name, :string, :limit => 64, :null => false
# 显示顺序
t.column :displayorder, :integer, :limit => 3, :null => false, :default => 0
t.column :left_value, :integer, :limit => 11, :null => false
t.column :right_value, :integer, :limit => 11, :null => false
t.timestamps
end
end
def self.down
drop_table :categories
end
end
此处,它会自动为创建的表加上主键id,如果你不需要主键,可以在这出代码加上
create_table :categories , :id => false do |t|
如果你想自定义主键名称,则可以这样写:
create_table :categories , :primary_key => 'role_id' do |t|
5. 运行rake db:migrate命令,将会在指定的数据库中自动生成两个表:
categories , schema_migrations[用于数据库迁移的,暂时不用管它]
6. 注意的地方,由于windows系统的缺省字符集的问题,如果数据库表构建文件中包含中文字符,
必须使用系统缺省的Ascii字符编码 ,就像上面的20091022065038_create_categories.rb文件,
必须使用Ascii字符编码.
3. 上面讲述了对单表的操作,这里再讲述下对多表以及外键的添加,此处给出基本RBAC功能的表结构实例:
1. ruby script\generate migration CreateUsers
20091022051819_create_users.rb
class CreateUsers < ActiveRecord::Migration
def self.up
#用户表
create_table :users ,:primary_key => 'user_id' do |t|
#名称
t.column :name, :string, :limit => 80, :null => false, :unique => true
#密码
t.column :password, :string, :limit => 80, :null => false
#邮件
t.column :email, :string, :limit => 255
t.timestamps
end
end
def self.down
drop_table :users
end
end
2. ruby script\generate migration CreateRolesAndUsersRoles
20091022052732_create_roles_and_users_roles.rb
class CreateRolesAndUsersRoles < ActiveRecord::Migration
def self.up
#角色表-- 角色类似Windwos系统中的用户组
create_table :roles,:primary_key => 'role_id' do |t|
#角色名称
t.column :name, :string, :limit => 80, :null => false, :unique => true
#角色描述
t.column :description, :string, :limit => 255
t.timestamps
end
# 用户角色关联表 -- 多对多的关系
create_table :users_roles, :id=>false do |t|
t.column :user_id, :integer, :null => false
t.column :role_id , :integer, :null => false
end
say_with_time '添加外键' do
# 给users_roles 添加外键
execute 'ALTER TABLE users_roles ADD CONSTRAINT fk_tb_roles FOREIGN KEY(role_id) REFERENCES roles(role_id) ON DELETE CASCADE'
execute 'ALTER TABLE users_roles ADD CONSTRAINT fk_tb_users FOREIGN KEY(user_id) REFERENCES users(user_id) ON DELETE CASCADE'
end
say_with_time '添加缺省角色和用户,并分配缺省组' do
execute(" INSERT INTO users values (1,'sese','$1$QZ4.ZF/.$9YDUbdcLkk.ldvEFNPbZg1','vb2005xu@qq.com','2009-10-22 16:23:47',0) ")
execute(" insert into roles values(1,'SYSTEM_ADMIN',NULL,'2009-10-22 16:23:47',0)")
execute(" insert into users_roles values(1 , 1) ")
end
end
def self.down
drop_table :users_roles
drop_table :roles
end
end
4. Rails DB DSL的局限性也有,从上例可以看到:
1. 添加外键时,得手动写SQL,这就不能实现跨数据库的操作,因为每种数据库的SQL都有些区别
2. 似乎不支持存储过程的创建
之上是我最近使用Rails的经验,刚接触不到一个月的时间,肯定有很多问题,请高手们指正,谢谢
作者: 色色
博客: http://vb2005xu.iteye.com
日期: 2009年10月27日
十一了解了rails,特别喜欢上了其中的rake db:migrate 指令,我并不是Rails程序员,而是PHP程序员.
在之后的项目中,我使用了Rails的数据库DSL来构建和管理项目中的MYSQL数据库,以下简要的描述些语法.
1. 了解RAILS DB DSL定义的数据类型与MYSQL数据库的数据类型是最重要的
Rails Migration Symbol | MySQL Data Type
:binary blob
:boolean tinyint(1)
:date date
:datetime datetime
:decimal decimal
:float float
:integer int(11)
:string varchar(255)
:text text
:time time
:timestamp datetime
2. 熟悉rails常用命令,关于RAILS环境搭建,见我上篇文章.
1. rails sdo_todo 生成一个项目
2. 在生成的文件夹sdo_todo下建立一个批处理文件open-console.bat,内容为:
cmd
此文件用于方便之后使用终端命令时可以自动切入到此目录下
修改其下的config\database.yml文件,里面换成你的数据库的链接属性
3. 运行open-console.bat文件,在打开的DOS提示符中输入
ruby script\generate migration CreateCategories
来创建分类数据表骨架代码,它将会在db\migrate\20091022065038_create_categories.rb文件,
文件名最前面的是此文件的创建时间戳,用于数据库迁移的,暂时不用管它,知道就行
4. 编辑 20091022065038_create_categories.rb 文件,内容如下所示:
class CreateCategories < ActiveRecord::Migration
def self.up
create_table :categories do |t|
# 父分类 id
t.column :parent_id, :integer, :limit => 11, :null => false
# 分类名称
t.column :name, :string, :limit => 64, :null => false
# 显示顺序
t.column :displayorder, :integer, :limit => 3, :null => false, :default => 0
t.column :left_value, :integer, :limit => 11, :null => false
t.column :right_value, :integer, :limit => 11, :null => false
t.timestamps
end
end
def self.down
drop_table :categories
end
end
此处,它会自动为创建的表加上主键id,如果你不需要主键,可以在这出代码加上
create_table :categories , :id => false do |t|
如果你想自定义主键名称,则可以这样写:
create_table :categories , :primary_key => 'role_id' do |t|
5. 运行rake db:migrate命令,将会在指定的数据库中自动生成两个表:
categories , schema_migrations[用于数据库迁移的,暂时不用管它]
6. 注意的地方,由于windows系统的缺省字符集的问题,如果数据库表构建文件中包含中文字符,
必须使用系统缺省的Ascii字符编码 ,就像上面的20091022065038_create_categories.rb文件,
必须使用Ascii字符编码.
3. 上面讲述了对单表的操作,这里再讲述下对多表以及外键的添加,此处给出基本RBAC功能的表结构实例:
1. ruby script\generate migration CreateUsers
20091022051819_create_users.rb
class CreateUsers < ActiveRecord::Migration
def self.up
#用户表
create_table :users ,:primary_key => 'user_id' do |t|
#名称
t.column :name, :string, :limit => 80, :null => false, :unique => true
#密码
t.column :password, :string, :limit => 80, :null => false
#邮件
t.column :email, :string, :limit => 255
t.timestamps
end
end
def self.down
drop_table :users
end
end
2. ruby script\generate migration CreateRolesAndUsersRoles
20091022052732_create_roles_and_users_roles.rb
class CreateRolesAndUsersRoles < ActiveRecord::Migration
def self.up
#角色表-- 角色类似Windwos系统中的用户组
create_table :roles,:primary_key => 'role_id' do |t|
#角色名称
t.column :name, :string, :limit => 80, :null => false, :unique => true
#角色描述
t.column :description, :string, :limit => 255
t.timestamps
end
# 用户角色关联表 -- 多对多的关系
create_table :users_roles, :id=>false do |t|
t.column :user_id, :integer, :null => false
t.column :role_id , :integer, :null => false
end
say_with_time '添加外键' do
# 给users_roles 添加外键
execute 'ALTER TABLE users_roles ADD CONSTRAINT fk_tb_roles FOREIGN KEY(role_id) REFERENCES roles(role_id) ON DELETE CASCADE'
execute 'ALTER TABLE users_roles ADD CONSTRAINT fk_tb_users FOREIGN KEY(user_id) REFERENCES users(user_id) ON DELETE CASCADE'
end
say_with_time '添加缺省角色和用户,并分配缺省组' do
execute(" INSERT INTO users values (1,'sese','$1$QZ4.ZF/.$9YDUbdcLkk.ldvEFNPbZg1','vb2005xu@qq.com','2009-10-22 16:23:47',0) ")
execute(" insert into roles values(1,'SYSTEM_ADMIN',NULL,'2009-10-22 16:23:47',0)")
execute(" insert into users_roles values(1 , 1) ")
end
end
def self.down
drop_table :users_roles
drop_table :roles
end
end
4. Rails DB DSL的局限性也有,从上例可以看到:
1. 添加外键时,得手动写SQL,这就不能实现跨数据库的操作,因为每种数据库的SQL都有些区别
2. 似乎不支持存储过程的创建
之上是我最近使用Rails的经验,刚接触不到一个月的时间,肯定有很多问题,请高手们指正,谢谢