Heroku, Rails: PG::SyntaxError

При загрузке схемы в моем приложении Rails 5.1 на героку возникает следующее исключение:

ActiveRecord::StatementInvalid: PG::SyntaxError: ОШИБКА: синтаксическая ошибка в строке 1 "ENGINE" или рядом с ней: ...estamp NOT NULL, временная метка "updated_at" NOT NULL) ENGINE=Inn...


Подробности:

Трассировка

-- create_table("ads_dashboard_campaigns", {:force=>:cascade, :options=>"ENGINE=InnoDB DEFAULT CHARSET=utf8"})
   (5.0ms)  DROP TABLE IF EXISTS "ads_dashboard_campaigns" CASCADE
   (7.3ms)  CREATE TABLE "ads_dashboard_campaigns" ("id" bigserial primary key, "created_at" timestamp NOT NULL, "updated_at" timestamp NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8
rails aborted!


config/database.yml

# # SQLite version 3.x
# #   gem install sqlite3-ruby (not necessary on OS X Leopard)
# development:
#   adapter: sqlite3
#   database: db/development.sqlite3
#   pool: 5
#   timeout: 5000

# # Warning: The database defined as "test" will be erased and
# # re-generated from your development database when you run "rake".
# # Do not set this db to the same as development or production.
# test:
#   adapter: sqlite3
#   database: db/test.sqlite3
#   pool: 5
#   timeout: 5000

production:
  adapter: sqlite3
  database: db/production.sqlite3
  pool: 5
  timeout: 5000


# Custom stuff
development:
  adapter: mysql2
  encoding: utf8
  pool: 5
  database: slooob_development
  username: root
  password: 0402Jonas
  port: 3306

test:
  adapter: mysql2
  encoding: utf8
  pool: 5
  database: slooob_test
  username: root
  password: 0402Jonas
  port: 3306

Примечание: я знаю, что Heroku использует базу данных PostgreSQL, но использование настроек по умолчанию для рабочей среды работало до того, как база данных для разработки и тестирования была настроена на MySQL. Я также попытался установить адаптер на postgresql.


Что я сделал не так?


person heroxav    schedule 11.03.2017    source источник


Ответы (2)


Ваша схема базы данных была сгенерирована в базе данных Mysql и содержит специальные параметры Mysql. В вашем случае это ENGINE вариант. Я не уверен, был ли он сгенерирован автоматически или вы добавили эти параметры вручную в миграцию.

Попробуйте запустить миграцию вместо загрузки схемы:

heroku run rake db:migrate

Вы также можете использовать Mysql на Heroku. Вам нужно добавить соответствующий аддон.

person Michał Młoźniak    schedule 11.03.2017

Взгляните на свои миграции — есть ли в них: options: "ENGINE=InnoDB DEFAULT CHARSET=utf8"? Удаление их и возврат к Heroku может решить проблему.


Подробнее

Это может быть новым для Rails 5 и затрудняет миграцию, не зависящую от базы данных. Параметры предназначены для MySQL и указывают, что следует использовать механизм хранения InnoDB.

Когда вы загружаете Heroku, ваш database.yml автоматически обновляется для использования Postgres. Однако ваши миграции остаются нетронутыми, а параметры движка недействительны для Postgres и вызывают ошибку.

Это также может повлиять на ваш schema.rb?

person gwcodes    schedule 11.03.2017
comment
Хорошо знать. Я просмотрел свои миграции раньше, и они не содержат каких-либо конкретных параметров. - person heroxav; 11.03.2017