Как я могу создать интерфейс для запроса базы данных Redshift (надеюсь, с Rails)
Итак, у меня есть база данных Redshift с достаточным количеством таблиц, что стоит моего времени, чтобы создать интерфейс, чтобы сделать запрос немного проще, чем просто вводить команды SQL.
В идеале я мог бы сделать это, подключив базу данных к приложению Rails (потому что у меня есть немного опыта работы с Rails). Я не уверен, как подключить удаленную базу данных Redshift к локальному приложению Rails или как заставить activerecord работать с redshift.
кто-нибудь есть ли какие-либо предложения/ресурсы, которые помогут мне начать работу? Я открыт для других вариантов подключения базы данных Redshift к интерфейсу, если есть готовые варианты проще, чем Rails.
3 ответов
#app/models/data_warehouse.rb
class DataWarehouse < ActiveRecord::Base
establish_connection "redshift_staging"
#or, if you want to have a db per environment
#establish_connection "redshift_#{Rails.env}"
end
обратите внимание, что мы подключаемся к 5439, а не по умолчанию 5432, поэтому я указываю порт Кроме того, я указываю схему beta, которую мы используем для наших нестабильных агрегатов, вы можете иметь другую БД для каждой среды, как указано выше, или использовать различные схемы и включать их в путь поиска ActiveRecord
#config/database.yml
redshift_staging:
adapter: postgresql
encoding: utf8
database: db03
port: 5439
pool: 5
schema_search_path: 'beta'
username: admin
password: supersecretpassword
host: db03.myremotehost.us #your remote host here, might be an aws url from Redshift admin console
###вариант 2, прямое соединение PG
class DataWarehouse < ActiveRecord::Base
attr_accessor :conn
def initialize
@conn = PG.connect(
database: 'db03',
port: 5439,
pool: 5,
schema_search_path: 'beta',
username: 'admin',
password: 'supersecretpassword',
host: 'db03.myremotehost.us'
)
end
end
[DEV] main:0> redshift = DataWarehouse
E, [2014-07-17T11:09:17.758957 #44535] ERROR -- : PG::InsufficientPrivilege: ERROR: permission denied to set parameter "client_min_messages" to "notice" : SET client_min_messages TO 'notice'
(pry) output error: #<ActiveRecord::StatementInvalid: PG::InsufficientPrivilege: ERROR: permission denied to set parameter "client_min_messages" to "notice" : SET client_min_messages TO 'notice'>
обновление:
я закончил с вариантом 1, но использование этого адаптера сейчас по нескольким причинам:
https://github.com/fiksu/activerecord-redshift-adapter
Причина 1: Адаптер ActiveRecord postgresql устанавливает client_min_messages Причина 2: адаптер также пытается установить часовой пояс, который redshift не позволяет (http://docs.aws.amazon.com/redshift/latest/dg/c_redshift-and-postgres-sql.html) Причина 3: Даже если вы измените код в ActiveRecord для первых двух ошибок, вы столкнетесь с дополнительные ошибки, которые жалуются, что Redshift использует Postgresql 8.0, в этот момент я перешел к адаптеру, вернется и обновится, если я найду что-то лучше позже.
я переименовал свою таблицу в base_aggregate_redshift_tests (обратите внимание на множественное число), поэтому ActiveRecord легко смог подключиться, если вы не можете изменить имена таблиц в redshift, используйте метод set_table, который я прокомментировал ниже
#Gemfile:
gem 'activerecord4-redshift-adapter', github: 'aamine/activerecord4-redshift-adapter'
1
#config/database.yml
redshift_staging:
adapter: redshift
encoding: utf8
database: db03
port: 5439
pool: 5
username: admin
password: supersecretpassword
host: db03.myremotehost.us
timeout: 5000
#app/models/base_aggregates_redshift_test.rb
#Model named to match my tables in Redshift, if you want you can set_table like I have commented out below
class BaseAggregatesRedshiftTest < ActiveRecord::Base
establish_connection "redshift_staging"
self.table_name = "beta.base_aggregates_v2"
end
в консоли с помощью личность.table_name -- обратите внимание, что он запрашивает правильную таблицу, поэтому вы можете назвать свои модели, как хотите
[DEV] main:0> redshift = BaseAggregatesRedshiftTest.first
D, [2014-07-17T15:31:58.678103 #43776] DEBUG -- : BaseAggregatesRedshiftTest Load (45.6ms) SELECT "beta"."base_aggregates_v2".* FROM "beta"."base_aggregates_v2" LIMIT 1
2
#app/models/base_aggregates_redshift_test.rb
class BaseAggregatesRedshiftTest < ActiveRecord::Base
set_table "beta.base_aggregates_v2"
ActiveRecord::Base.establish_connection(
adapter: 'redshift',
encoding: 'utf8',
database: 'staging',
port: '5439',
pool: '5',
username: 'admin',
password: 'supersecretpassword',
search_schema: 'beta',
host: 'db03.myremotehost.us',
timeout: '5000'
)
end
#in console, abbreviated example of first record, now it's using the new name for my redshift table, just assuming I've got the record at base_aggregates_redshift_tests because I didn't set the table_name
[DEV] main:0> redshift = BaseAggregatesRedshiftTest.first
D, [2014-07-17T15:09:39.388918 #11537] DEBUG -- : BaseAggregatesRedshiftTest Load (45.3ms) SELECT "base_aggregates_redshift_tests".* FROM "base_aggregates_redshift_tests" LIMIT 1
#<BaseAggregatesRedshiftTest:0x007fd8c4a12580> {
:truncated_month => Thu, 31 Jan 2013 19:00:00 EST -05:00,
:dma => "Cityville",
:group_id => 9712338,
:dma_id => 9999
}
удачи @johncorser!
этот учебник поможет вам настроить приложение rails с адаптером redshift:
https://www.credible.com/code/setting-up-a-data-warehouse-with-aws-redshift-and-ruby/
в двух словах:
клон образец приложение:
git clone git@github.com:tuesy/redshift-ruby-tutorial.git
cd redshift-ruby-tutorial
Настройка переменных ENV через ~/.bashrc
(или dotenv):
export REDSHIFT_HOST=redshift-ruby-tutorial.ccmj2nxbsay7.us-east-1.redshift.amazonaws.com
export REDSHIFT_PORT=5439
export REDSHIFT_USER=deploy
export REDSHIFT_PASSWORD=<your password here>
export REDSHIFT_DATABASE=analytics
export REDSHIFT_BUCKET=redshift-ruby-tutorial
использовать gem activerecord4-redshift-adapter
, в Gemfile:
'activerecord4-redshift-adapter', '~> 0.2.0' # For Rails 4.2
'activerecord4-redshift-adapter', '~> 0.1.1' # For Rails 4.1
затем вы можете запрос в redshift, как и в обычной модели AR:
bundle exec rails c
RedshiftUser.count
(раскрытие: я еще не дал этому методу попробовать, но я могу скоро)
возможно, вы захотите рассмотреть http://www.looker.com/. Это интерфейс для изучения вашей БД, позволяющий легко сохранять запросы и графический интерфейс, который также могут использовать бизнес-парни.