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.
中的数据访问
我正在使用 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.
中的数据访问