【问题标题】:Rails migration and CREATE UNIQUE INDEX not working on DashDB / DB2Rails 迁移和 CREATE UNIQUE INDEX 不适用于 DashDB / DB2
【发布时间】:2017-03-06 01:51:40
【问题描述】:

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

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 语句失败,似乎要运行它们,表必须是 organized by row

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

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

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

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

我的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

【问题讨论】:

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


    【解决方案1】:

    有一个数据库配置参数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 仍将创建唯一索引来支持这些约束,但它们不会用于按列组织的表中的数据访问。

    【讨论】:

    • 很遗憾,我无法访问 Bluemix 上的 CLI,我认为这是这个 IBM 解决方案的主要缺点之一。但是,我可以运行 SQL 查询,以便能够更改表。此外,我将能够使用您的提示设置我的本地 DashDB :-) 我知道这对于 Web 应用程序来说是一个相当糟糕的选择,我应该使用 DashDB Transactional 版本,但我需要了解 ibm_db 如何与 Rails 一起使用。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-07-07
    • 2015-06-19
    • 1970-01-01
    • 2021-08-29
    • 2013-06-22
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    相关资源
    最近更新 更多