#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
Perhatikan bahwa kami terhubung pada 5439, bukan default 5432 jadi saya tentukan portnya. Juga, saya tentukan skema, beta, yang kami gunakan untuk agregat tidak stabil kami, Anda bisa memiliki db berbeda per lingkungan seperti yang disebutkan di atas, atau gunakan berbagai skema dan sertakan dalam jalur pencarian untuk 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
###OPSI 2, Koneksi PG langsung
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'>
PEMBARUAN:
Saya akhirnya memilih opsi 1, tetapi menggunakan adaptor ini untuk saat ini karena beberapa alasan:
https://github.com/fiksu/activerecord-redshift-adapter
Alasan 1: Adaptor postgresql ActiveRecord menyetel client_min_messages Alasan 2: adaptor juga mencoba menyetel Zona Waktu, yang tidak diizinkan oleh pergeseran merah (http://docs.aws.amazon.com/redshift/latest/dg/c_redshift-and-postgres-sql.html) Alasan 3: Meskipun Anda mengubah kode di ActiveRecord untuk dua kesalahan pertama, Anda mengalami kesalahan tambahan yang mengeluh bahwa Redshift menggunakan Postgresql 8.0, pada saat itu saya beralih ke adaptor, akan mengunjungi kembali dan memperbarui jika saya menemukan sesuatu yang lebih baik nanti.
Saya mengganti nama tabel saya menjadi base_aggregate_redshift_tests (pemberitahuan jamak) sehingga ActiveRecord dapat dengan mudah terhubung, jika Anda tidak dapat mengubah nama tabel Anda dalam pergeseran merah gunakan metode set_table yang saya komentari di bawah
#Gemfile:
gem 'activerecord4-redshift-adapter', github: 'aamine/activerecord4-redshift-adapter'
Pilihan 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
di konsol menggunakan self.table_name -- perhatikan ia menanyakan tabel yang tepat, sehingga Anda dapat memberi nama model apa pun yang Anda inginkan
[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
pilihan 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
}
Semoga beruntung @johncorser!
person
harrisjb
schedule
17.07.2014