Как обновить строки в базе данных значениями из data.frame в R условно

У меня есть data.frame в R - соответствует примерно 1000+ строк

names(matches)
[1] "name"  "c_id"  "fname" "lname" "address" "zip_code"    "Weight"

nrow(matches)
[1] 1253

У меня есть таблица базы данных postgresql - list_m со следующими столбцами

db_name, db_cid, db_weight, processing_status, request_id, fname, mname, lname и т. д.

Я хочу обновить значения только нескольких столбцов (db_c_id, db_weight и статус обработки) в таблице, используя значения из data.frame.

На данный момент я перебираю data.frame, чтобы создать запросы на обновление, а затем запустить запросы.

for(row in 1:nrow(matches) {   
    query1 <- paste0(query1, "UPDATE list_m SET db_name = ",matches$name[row],", db_weight = ",matches$weight[row],",  processing_status = 'MATCHED'
 WHERE request_id=111 AND db_c_id = '", matches$c_id[row], "';")
}

поэтому он в основном создает переменную query1 с

 UPDATE list_m SET db_name = 'HILLARY', db_weight = 51.41, processing_status = 'MATCHED' WHERE request_id=111 AND db_c_id = '1015310246';

 UPDATE list_m SET db_name = 'SANDERS', db_weight = 45.16, processing_status = 'MATCHED' WHERE request_id=111 AND db_c_id = '1015120982';

 ...

 ...

 ...

 UPDATE list_m SET db_name = 'OBAMA', db_weight = 67.11, processing_status = 'MATCHED' WHERE request_id=111 AND db_c_id = '1015110111'; 

 UPDATE list_m SET db_name = 'TRUMP', db_weight = 41.22, processing_status = 'MATCHED' WHERE request_id=111 AND db_c_id = '1013024634';

который затем будет выполнен с использованием

dbSendStatement(con, query1)

Я хотел бы сделать это, параметризовав значения... что-то вроде

query2 <- "UPDATE list_m SET db_name=?,db_weight=?,processing_status='MATCHED' WHERE request_id=111 and db_c_id=?";

dbSendStatement(con, query2, matches$name, matches$weight, matches$c_id)

этот оператор должен выполняться для каждой строки совпадений data.frame.


person Avinash Sonee    schedule 21.12.2016    source источник
comment
con — это строка подключения к БД: › drv ‹- dbDriver(PostgreSQL) › con ‹- dbConnect(drv, dbname=config$db$name,host=config$db$host,port=config$db$port,user=config $db$user,password=config$db$pass )   -  person Avinash Sonee    schedule 21.12.2016


Ответы (1)


Это может быть точно аппроксимировано с помощью sprintf

sql_string <- "UPDATE list_m SET db_name = %s, db_weight = %s,  processing_status = 'MATCHED' WHERE request_id=111 AND db_c_id = '%s';"

dbSendStatement(con, paste(sprintf(sql_string, matches$name, matches$weight, matches$c_id), collapse=""))
person manotheshark    schedule 21.12.2016
comment
@Parfait изменил ответ на приблизительные параметры, используя sprintf - person manotheshark; 21.12.2016
comment
Я думал, что ваш подход был отличным. Просто нужно было придерживаться синтаксиса Postgres и посоветовать OP экспортировать кадр данных в виде временной таблицы, полностью избегая цикла for. - person Parfait; 21.12.2016
comment
Этот подход великолепен! Возможно ли это с именованными параметрами вместо того, чтобы просто полагаться на порядок параметров? - person SunWuKung; 27.11.2020
comment
@SunWuKung команда может быть заключена в функцию, которая позволит использовать именованные параметры. Однако функция вернется к порядку параметров, если имена параметров не используются при вызове функции. - person manotheshark; 30.11.2020