2016-01-12 5 views
1

Я новичок в подключении к Redshift через R, я прочитал другие вопросы, но по-прежнему получаю сообщение об ошибке при попытке создать таблицу. Я успешно установить соединение, и я думал создать таблицу успешно:Redshift with R

redshiftcon <- dbConnect(mm, user="username", password="secret_password", 
        dbname="dbtable", host="hostname", port="portnumber") 


dbSendQuery(redshiftcon, 
"create table ss_playground.test_table (unique_id VARCHAR, 
category VARCHAR, 
name VARCHAR, 
number_min float);") 

<PostgreSQLResult:(70214,5,1)> 

Однако при попытке проверить, существует ли таблица и, если поля там, я получаю следующее сообщение:

dbExistsTable(redshiftcon, ss_playground.test_table) 

Error in is(object, Cl) : 
error in evaluating the argument 'name' in selecting a method for function 
'dbExistsTable': Error: object 'ss_playground.test_table' not found 

> dbExistsTable(redshiftcon, 'ss_playground.test_table') 
[1] FALSE 

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

> dbSendQuery(redshiftcon, 
     "create table ss_playground.test_table (unique_id VARCHAR, 
category VARCHAR, 
name VARCHAR, 
number_min float);") 

Error in postgresqlExecStatement(conn, statement, ...) : 
RS-DBI driver: (could not Retrieve the result : ERROR: Relation 
'test_table' already exists) 

Есть ли что-то мне не хватает?

Пожалуйста, помогите! Thank you

+1

Я не уверен, но попробуйте добавить 'совершить,' после создания таблицы. Возможно, ваши изменения зависят от сеанса, и вы можете сначала их зафиксировать. – rohitkulky

ответ

2

Я думаю, что ss_playground это не по умолчанию схема для этого пользователя/роли. Вы можете настроить схему по умолчанию. Загляните в лайтбокс here.

Чтобы исправить код быстро вы можете попробовать:

dbExistsTable(redshiftcon, c("ss_playground","test_table")) 

или взломать его как

any(grepl("test_table",dbListTables(redshiftcon))) 
+0

Спасибо, что было очень полезно! с этим кодом я вижу, что на самом деле таблица существует. '> dbExistsTable (redshiftcon, c (" ss_playground "," test_table ")) [1] ИСТИНА' Мне нужно будет следить за предоставлением разрешений? – RCN

+1

Предполагая, что ваш пользователь '' username'' имеет доступ к схеме, просто запустите '' SET search_path = ss_playground, public; ''. Так выглядит '' rs <- dbSendQuery (conn = redshiftcon, "SET search_path = ss_playground, public;") ''. Тогда вам не нужно делать '' c (schema, tabl_name) '' и может получить только запрос с помощью '' dbExistsTable (redshiftcon, test_table) ''. –

+0

Я особенно не хочу публиковать эту общую схему, есть ли способ сделать только эту конкретную таблицу открытой? Я играл с помощью '> dbSendQuery (redshiftcon,« выделить выделение на test_table в schema ss_playground to readonly; »)', где readonly - это еще один пользователь – RCN