Как сделать ALTER EXTENSION с базой данных Heroku Postgres?

Я использую apartment gem для моего SaaS (построенного с Ruby on Rails) и одним из его требований является необходимость установки hstore Расширение PostgreSQL через выделенную схему (то есть: shared_extensions), не по умолчанию public схемы.

Heroku позволяет hstore по умолчанию; Однако он установлен в public схемы. Когда я пытался сделать:

ActiveRecord::Base.connection.execute("ALTER EXTENSION hstore SET SCHEMA hstore;")

консоль вернулась:

(3.6ms) ALTER EXTENSION hstore SET SCHEMA hstore; PG::Error: ERROR: must be owner of extension hstore

В настоящее время невозможно на стороне кода обойтись hstore расширение устанавливается на publicпоэтому я определенно должен найти способ поставить hstore расширение на shared_extensions схемы.

Будет ли способ сделать это на Heroku? Благодарю.

2 ответа

Решение

Оказывается, я не могу сделать ALTER EXTENSION hstore SET SCHEMA hstore; на Heroku. Я задокументировал обходной путь здесь

  1. присоединять ?schema_search_path=public,hstore на ваш DATABASE_URL переменная окружения, этим вам не нужно пересматривать database.yml файл (что невозможно, так как Heroku восстанавливает совершенно другой и неизменный database.yml свой на каждом развертывании)
  2. Бежать heroku pg:psql из вашей командной строки
  3. А потом DROP EXTENSION hstore; (Примечание: при этом будут удалены все столбцы, которые используют hstore типа, поэтому действуйте с осторожностью; делайте это только со свежим экземпляром PostgreSQL)
  4. Следующий: CREATE SCHEMA IF NOT EXISTS hstore;
  5. В заключение: CREATE EXTENSION IF NOT EXISTS hstore SCHEMA hstore; и нажмите ввод (\q выходить)

Менее разрушительная альтернативная работа:

1.) Переведите ваше приложение в режим обслуживания: heroku maintenance:on -a [app-name] 2.) Сделайте резервную копию вашей базы данных: ВСЕГДА ПОДНИМАЙТЕ ЕГО:) heroku pg:backups capture -a [app-name] 3.) Скопируйте вашу базу данных локально: heroku pg:pull [Database URL] mylocaldb -a [app-name] 4.) Теперь у вас есть локальная база данных, вы можете перемещать расширения без какого-либо уничтожения данных или столбцов, поскольку у вас есть локальный привилегированный пользователь: ALTER EXTENSION "hstore" SET SCHEMA hstore; 5.) Теперь экспортируйте эту версию обратно в производство: heroku pg:push mylocaldb [Database URL] -a [app-name] 6.) Выньте свое приложение из службы поддержки. режим, и теперь у вас есть расширения, установленные в общей схеме hstore.

7.) Вам все равно нужно будет выполнить шаг 1 ответа Ту Х., если вы находитесь на рельсах < 4.1

ИЛИ, если вы используете rails 4.1+, вы можете просто обновить файл database.yml: schema_search_path: "public,hstore"

Это менее разрушительный способ получить то, что вы хотите, без лишних простоев.

Другие вопросы по тегам