[英]How to use parameters with RPostgreSQL (to insert data)
我正在嘗試使用RPostgreSQL
將數據插入到預先存在的 PostgreSQL 表中,但我無法弄清楚 SQL 參數(准備好的語句)的語法。
例如假設我想做以下事情
insert into mytable (a,b,c) values ($1,$2,$3)
如何指定參數? dbSendQuery
似乎不明白您是否只是將參數放入...
。
我發現dbWriteTable
可用於轉儲整個表,但不會讓您指定列(因此對默認值等dbWriteTable
)。 無論如何,一旦我在那里獲取數據,我就需要知道其他查詢的這一點(所以我想這並不是真正的插入特定的)!
當然,我只是錯過了一些明顯的東西......
出於同樣的原因,我一直在尋找同樣的東西,那就是安全性。
顯然 dplyr 包具有您感興趣的容量。它幾乎沒有記錄,但它就在那里。 在這個小插圖中向下滾動到“Postgresql”: http : //cran.r-project.org/web/packages/dplyr/vignettes/databases.html
總而言之,dplyr 提供了 sql() 和 escape() 函數,可以將它們組合起來生成參數化查詢。 DBI 包中的 SQL() 函數似乎以完全相同的方式工作。
> sql(paste0('SELECT * FROM blaah WHERE id = ', escape('random "\'stuff')))
<SQL> SELECT * FROM blaah WHERE id = 'random "''stuff'
它返回一個“sql”和“character”類的對象,因此您可以將其傳遞給 tbl() 或也可能傳遞給 dbSendQuery()。
escape() 函數也可以正確處理向量,我認為它最有用:
> sql(paste0('SELECT * FROM blaah WHERE id in ', escape(1:5)))
<SQL> SELECT * FROM blaah WHERE id in (1, 2, 3, 4, 5)
同樣自然也適用於變量:
> tmp <- c("asd", 2, date())
> sql(paste0('SELECT * FROM blaah WHERE id in ', escape(tmp)))
<SQL> SELECT * FROM blaah WHERE id in ('asd', '2', 'Tue Nov 18 15:19:08 2014')
我現在把查詢放在一起感覺更安全。
從最新的RPostgreSQL
它應該可以工作:
db_connection <- dbConnect(dbDriver("PostgreSQL"), dbname = database_name,
host = "localhost", port = database_port, password=database_user_password,
user = database_user)
qry = "insert into mytable (a,b,c) values ($1,$2,$3)"
dbSendQuery(db_connection, qry, c(1, "some string", "some string with | ' "))
這是一個使用DBI
和RPostgres
包的版本,並一次插入多行,因為這么多年過去了,仍然很難從文檔中找出RPostgres
。
x <- data.frame(
a = c(1:10),
b = letters[1:10],
c = letters[11:20]
)
# insert your own connection info
con <- DBI::dbConnect(
RPostgres::Postgres(),
dbname = '',
host = '',
port = 5432,
user = '',
password = ''
)
RPostgres::dbSendQuery(
con,
"INSERT INTO mytable (a,b,c) VALUES ($1,$2,$3);",
list(
x$a,
x$b,
x$c
)
)
DBI
包中dbBind()
的幫助是唯一解釋如何格式化參數的地方:
DBI 目前沒有指定占位符格式; 將來,可能會支持統一的占位符語法。 請參閱后端文檔以了解支持的格式.... 已知示例是:
?
(按出現順序進行位置匹配)在 RMySQL 和 RSQLite 中- RPostgres 和 RSQLite 中的
$1
(按索引進行位置匹配)- RSQLite 中的
:name
和$name
(命名匹配)
?
也是 R 包RJDBC
的占位符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.