Rails迁移和CREATE UNIQUE INDEX无法在DashDB / DB2上运行

时间:2016-10-24 10:13:17

标签: ruby-on-rails ibm-cloud db2-luw unique-index dashdb

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

UTF-8

两个用于创建唯一索引:

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) 创建表类型。 organize by column语句失败,似乎要运行它们,表格必须为CREATE UNIQUE INDEX

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

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

organize by row

我想我可以继续碰到同样的问题,所以我想找到一种方法来默认按行排列所有表,最好是迁移。有没有人遇到过这个问题?

我的CREATE TABLE schema_migrations (version varchar(255) NOT NULL) CREATE UNIQUE INDEX unique_schema_migrations ON schema_migrations (version) 看起来如下:

manifest.yml

这是我的gemfile:

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

1 个答案:

答案 0 :(得分:2)

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

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

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

另一方面,由于您使用的是dashDB,可能您计划从列存储性能中受益,并且它不使用索引(强制执行唯一性除外),因此可以选择另一种方法,而不是创建唯一索引,向表中添加唯一约束,这也是列组织表支持的。

ALTER TABLE users ADD CONSTRAINT u_users_on_email UNIQUE (email)

等。有趣的是,DB2仍然会创建唯一的索引来支持这些约束,但它们不会用于列组织表中的数据访问。