Rails 迁移和 CREATE UNIQUE INDEX 不适用于 DashDB / DB2

Rails migration and CREATE UNIQUE INDEX not working on DashDB / DB2

我正在使用 Ruby 2.3.0 在 IBM Bluemix 上开发 Rails 4.2.7 应用程序。当我安装 Devise 时,用户模型迁移已经生成,只是一个标准文件,没有花哨的选项。在部署期间,迁移会触发三个查询。第一个用户 table 创建:

CREATE TABLE users (
 id INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 1) PRIMARY KEY, 
 email varchar(255) DEFAULT '' NOT NULL, 
 encrypted_password varchar(255) DEFAULT '' NOT NULL, 
 reset_password_token varchar(255),  
 reset_password_sent_at timestamp,  
 remember_created_at timestamp,  
 sign_in_count integer DEFAULT 0 NOT NULL,  
 current_sign_in_at timestamp,  
 last_sign_in_at timestamp,  
 current_sign_in_ip varchar(255),  
 last_sign_in_ip varchar(255),  
 created_at timestamp NOT NULL,  
 updated_at timestamp NOT NULL)

还有两个用于创建唯一索引:

CREATE UNIQUE INDEX index_users_on_email ON USERS(email)
CREATE UNIQUE INDEX index_users_on_reset_password_token ON USERS(reset_password_token)

第一个语句 运行 很好,正在创建 table。但是,问题是默认情况下 table 类型是用 organize by column 创建的。 CREATE UNIQUE INDEX 语句失败了,看来 运行 他们认为 table 必须是 organized by row

我可以删除迁移并通过 SQL 语句直接在数据库中创建 table 并在末尾添加 organize by row 子句,然后 运行 两个剩余查询.

问题是我在迁移时遇到了同样的问题 运行 以下两个查询确实再次失败了:

CREATE TABLE schema_migrations (version varchar(255) NOT NULL)
CREATE UNIQUE INDEX unique_schema_migrations ON schema_migrations (version)

我想我可以再次遇到同样的问题,所以我想找到一种方法让所有 table 默认按行组织,最好是通过迁移。有没有人遇到过这个问题?

我的 manifest.yml 看起来如下:

applications:
- path: .
  buildpack: https://github.com/cloudfoundry/ruby-buildpack.git
  memory: 1024M
  instances: 1
  domain: eu-gb.mybluemix.net
  name: windykacja
  host: windykacja
  disk_quota: 1024M
  services:
  - dashDB-win

这是我的 gemfile:

source 'https://rubygems.org'
ruby '2.3.0'

gem 'rails', '4.2.7'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.1.0'
gem 'devise'
gem 'bootstrap-sass', '~> 3.3.6'
gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 2.0'
gem 'sdoc', '~> 0.4.0', group: :doc


group :production do
    gem 'rails_12factor'
    gem 'ibm_db'
end

group :development, :test do
  gem 'byebug'
end

group :development do
  gem 'web-console', '~> 2.0'
  gem 'spring'
  gem 'sqlite3'
end

有一个数据库配置参数 dft_table_org 可以提供帮助。您必须使用 DB2 命令行处理器或 CLPPlus 来发出命令:

update db cfg for <your-db-name> using dft_table_org row

请注意,根据您拥有的 dashDB 服务的类型,您可能没有足够的权限执行此命令。

另一方面,由于您使用的是 dashDB,大概您打算从列存储性能中获益,并且它不使用索引(除了强制唯一性),因此替代方案是,而不是创建唯一性索引,向 table 添加唯一约束,这也支持按列组织的 table。

ALTER TABLE users ADD CONSTRAINT u_users_on_email UNIQUE (email)

等有趣的是,DB2 仍将创建唯一索引来支持这些约束,但它们不会用于按列组织的 tables.

中的数据访问