Используя RPostgres, что я должен использовать, чтобы «установить роль ...» для таблицы, которую я буду записывать в БД?
Я новичок в подключении к базам данных через R и пытаюсь найти лучшие практики, чтобы свести к минимуму ошибки и проблемы. Я загружаю таблицу из R в базу данных postgres, и мне нужно установить разрешения для определенной группы, название которой я знаю.
Я пытаюсь выяснить различное поведение и лучшие практики для различных функций DBI, чтобы случайно не сделать ошибку и не испортить базу данных.
Я не знаю, следует ли мне использовать dbExecute() или dbSendQuery(). Я прочитал документацию R для обеих функций и понимаю, что они выполняют команды sql для изменения подключенной базы данных. Я понимаю, что dbExecute() сообщает мне количество затронутых строк, но dbSendQuery(), похоже, тоже. dbExecute(), кажется, использует dbSendStatement(), но это не помогает мне понять разницу, потому что кажется похожей.
Я не могу объяснить поведение, которое я вижу в этих двух примерах ниже. Они оба делают одно и то же? Они оба рабочие? Один способ лучше или безопаснее другого?
Пример 1
res <- dbExecute(con,'set role certain_group')
print(res) # output is: [1] 0
dbClearResult(res) # output is: Error in (function (classes, fdef, mtable) :
# unable to find an inherited method for function ‘dbClearResult’ for signature ‘"integer"’
Пример 2
res2 <- dbSendQuery(con,'set role certain_group')
print(res2) # output is: <PqResult>
SQL set role certain_group
ROWS Fetched: 0 [complete]
Changed: 0
dbClearResult(res) # no output in console
Последнее замечание: я предпочитаю использовать пакет RPostgres, а не другие варианты.
1 ответ
В SQL большинство команд относятся к двум типам: запросы действия, влияющие на данные (т. е.
INSERT
,
UPDATE
,
DELETE
,
DROP
) или запросы набора результатов, которые возвращают данные (т. е.
SELECT
).
В DBI R разные методы запускают эти два типа команд в документации:
- в основном используется для запросов действий и фактически является оболочкой для
dbSendStatement
+ + . Согласно документам:
dbExecute: выполнить оператор обновления, запросить количество затронутых строк, а затем закрыть набор результатов.
-
dbGetQuery
в основном используется для запросов набора результатов, переносящих результаты во фрейм данных, и фактически является оболочкой для +dbFetch
+ . Согласно документам:
dbGetQuery: отправить запрос, получить результаты, а затем очистить набор результатов.
С учетом сказанного, оба и должны выполнять оператор SQL любого типа, но их возвращаемые значения различаются. В зависимости от вкуса упаковки (т.
odbc
,
ROracle
,
RMySQL
,
RPostgreSQL
), вам может понадобиться использовать для запуска операторов действий, особенно для параметров привязки с
dbBind
. Но никогда не вернет кадр данных!
Ваш специфичный для Postgres
SET
оператор является запросом специального действия. Поэтому просто вызовите команду run и извлеките все затронутые строки. В качестве альтернативы позвоните
dbSendQuery
+
dbGetRowsAffected
+
dbClearResult
чтобы, возможно, достичь того же результата, что и
dbExecute
.