Используя 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.

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