Миграция Rails и CREATE UNIQUE INDEX не работают на DashDB / DB2

Я работаю над приложением Rails 4.2.7 на IBM Bluemix с использованием Ruby 2.3.0. Когда я установил Devise User, была сгенерирована миграция модели, просто стандартный файл, без дополнительных опций. Во время развертывания миграция запускает три запроса. Первый для создания таблицы пользователей:

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

и вот мой гемфайл:

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

person Kociamber    schedule 24.10.2016    source источник


Ответы (1)


Есть параметр конфигурации базы данных _ 1_, которые могут помочь. Вам нужно будет использовать процессор командной строки 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 по-прежнему будет создавать уникальные индексы для поддержки этих ограничений, но они не будут использоваться для доступа к данным в таблицах с организацией по столбцам.

person mustaccio    schedule 24.10.2016
comment
К сожалению, у меня нет доступа к CLI на Bluemix, я думаю, что это один из основных недостатков этого решения IBM. Однако я могу запускать SQL-запросы, поэтому я могу изменять таблицу. Также я смогу настроить свой локальный DashDB, используя ваши подсказки :-) Я знаю, что это довольно плохой выбор для веб-приложения, и я должен использовать версию DashDB Transactional, но мне нужно было узнать, как ibm_db работает с Rails. Спасибо! - person Kociamber; 27.10.2016