#ruby-on-rails #oracle #rails-activestorage
Вопрос:
Я получаю эту ошибку при запуске активной миграции хранилища.
ActiveRecord::StatementInvalid: OCIError: ORA-00955: name is already used by an existing object: CREATE TABLE "ACTIVE_STORAGE_BLOBS" ("ID" NUMBER(38) NOT NULL PRIMARY KEY, "KEY" VARCHAR2(255) NOT NULL, "FILENAME" VARCHAR2(255) NOT NULL, "CONTENT_TYPE" VARCHAR2(255), "METADATA" CLOB, "BYTE_SIZE" NUMBER(19) NOT NULL, "CHECKSUM" VARCHAR2(255) NOT NULL, "CREATED_AT" TIMESTAMP NOT NULL)
Вот файл переноса активного хранилища, который используется для создания таблицы «Большой двоичный объект хранилища» и «Вложения активного хранилища».
# This migration comes from active_storage (originally 20170806125915)
class CreateActiveStorageTables < ActiveRecord::Migration[5.2]
def change
create_table :active_storage_blobs do |t|
t.string :key, null: false
t.string :filename, null: false
t.string :content_type
t.text :metadata
t.bigint :byte_size, null: false
t.string :checksum, null: false
t.datetime :created_at, null: false
t.index [ :key ], unique: true
end
create_table :active_storage_attachments do |t|
t.string :name, null: false
t.references :record, null: false, polymorphic: true, index: false
t.references :blob, null: false
t.datetime :created_at, null: false
t.index [ :record_type, :record_id, :name, :blob_id ], name: "index_active_storage_attachments_uniqueness", unique: true
t.foreign_key :active_storage_blobs, column: :blob_id
end
end
end
Конфигурация системы
Rails version: 5.2.0
activerecord-oracle_enhanced-adapter: 5.2.0
ruby-oci8: 2.2.6.1
Ruby version: 2.6.0
Oracle Database version: 10.2.0.1.0
Комментарии:
1. Oracle 10.2 ?? Вы используете относительно новую платформу Java с очень — очень старой версией Oracle. Это не имеет никакого отношения к ошибке-у вас есть объект с тем же именем в схеме , которую вы пытаетесь запустить с помощью инструкции create table, — но вам следует подумать об использовании более новой версии Oracle.
2. @RobertoHernandez, да, вы правы, что объект присутствует с тем же именем в схеме, но мой вопрос в том, почему это происходит снова, потому что я уже запустил все миграции. после обновления ruby с 5.1 до 5.2, а затем запуска Rspec, получите отсутствующую ошибку миграции, а затем запустите команду миграции, получившую эту ошибку.
3. вы уверены, что при повторном запуске миграции объекты будут удалены ? или что вы создаете два объекта с одинаковым именем ( например, таблицу и представление )
4. @RobertoHernandez Я создаю только один объект с таким именем, у меня есть только один файл для активного хранения
5. вы пытались удалить все таблицы в этой схеме перед запуском миграции ? Я предполагаю, что вы подключаетесь к базе данных с тем же пользователем, что и владелец схемы этих таблиц, верно ?
Ответ №1:
Ошибка говорит, что объект (не обязательно таблица), имя которого ACTIVE_STORAGE_BLOB
уже существует в этой схеме.
Что делать? Сначала выясните, что это такое на самом деле, запросив
select * from user_objects where object_name = 'ACTIVE_STORAGE_BLOB';
Затем решите, что делать:
- может быть, вы ничего не сделаете и продолжите использовать существующий объект
- возможно, вам придется переименовать таблицу, которую вы пытаетесь создать. Или,
- возможно, вы удалите существующий объект, чтобы создать таблицу.
Это зависит от того, что вы узнаете.
Комментарии:
1. Я просто хочу знать, почему это произошло, но миграция уже началась.
2. Почему случилось что? Ошибка произошла из-за того, что объект с таким именем уже существует, и у вас не может быть двух объектов в одной схеме с одинаковым именем.
3. да, вы правы в том, что объект присутствует с тем же именем в схеме, но мой вопрос в том, почему это происходит снова, потому что я уже выполняю все миграции. после обновления ruby с 5.1 до 5.2, а затем запуска Rspec, получите отсутствующую ошибку миграции, а затем запустите команду миграции, получившую эту ошибку.
4. Извините, я ничего не знаю ни о Ruby, ни о Rspec, ни о «миграции», которую вы делаете. Я только что ответил на ваш вопрос об ORA-00955.