2016-10-24 3 views
1

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

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 

ответ

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

+0

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