什么是dbplyr動詞組合,相當于DBI::dbSendQuery(con, "DELETE FROM <table> WHERE <condition>").
我想要的不是從資料庫中查詢資料,而是從資料庫中洗掉資料和更新資料庫中的表。
我想以某種dplyr方式做到這一點,但我不確定是否可行。我在包參考中找不到任何類似的東西。
uj5u.com熱心網友回復:
dbplyr 將 dplyr 命令轉換為查詢資料庫表。我不知道使用純 dbplyr 修改現有資料庫表的任何內置方法。
這很可能是一種設計選擇。
- 在 R 中,我們不需要區分從表中獲取資料(查詢)和修改表。這可能是因為在 R 中,如果發生錯誤/錯誤,我們可以將原始資料重新加載到記憶體中。
- 但是在資料庫中查詢和修改表是故意不同的事情。修改資料庫時,您正在修改源,以便使用其他控制元件(因為恢復已洗掉的資料要困難得多)。
DBI 包可能是你修改資料庫的最佳選擇
這是我用于所有 dbplyr 作業的方法。通常是一個自定義函式,它接受 dbplyr 翻譯生成的查詢并將其插入到 DBI 呼叫中(您可以在我的dbplyr 助手GitHub 存盤庫中看到此示例)。
為此考慮兩種方法:(1) 反聯接(在所有列上),然后撰寫新表,(2)DELETE FROM語法。
模擬反連接方法
records_to_remove = remote_table %>%
filter(conditions)
desired_final_table = remote_table %>%
anti_join(records_to_remove, by = colnames(remote_table))
query = paste0("SELECT * INTO output_table FROM (",
sql_render(desired_final_table),
") AS subquery")
DBI::dbExecute(db_con, as.character(query))
DELETE FROM 語法的模擬
records_to_remove = remote_table %>%
filter(conditions)
query = sql_render(records_to_remove) %>%
as.character() %>%
gsub(search_term = "SELECT *", replacement_term = "DELETE")
DBI::dbExecute(db_con, query)
如果您計劃多次運行這些查詢,則建議將它們包裝在一個函式中,并檢查有效性。
對于某些用例,不需要洗掉行。
您可以將filterR中的命令視為從表中洗掉行。例如在 R 中,我們可能會運行:
prepared_table = input_table %>%
filter(colX == 1) %>%
select(colA, colB, colZ)
并將其視為colX == 1在生成輸出之前洗掉行:
output = prepared_table %>%
group_by(colA) %>%
summarise(sumZ = sum(colZ))
(或者您可以使用上面的反連接而不是過濾器。)
但是對于這種型別的洗掉,您不需要編輯源資料,因為您可以在每次運行時過濾掉不需要的行。是的,它會使您的資料庫查詢更大,但這對于使用資料庫是正常的。
所以在SQL中結合準備和輸出是正常的(類似這樣):
SELECT colA, SUM(colZ) AS sumZ
FROM (
SELECT colA, colB, colZ
FROM input_table
WHERE colX = 1
) AS prepared_table
GROUP BY colA
所以除非你需要修改資料庫,否則我建議過濾而不是洗掉。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/385818.html
