簡體   English   中英

如何在 RPostgreSQL 中使用參數(插入數據)

[英]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 | ' "))

這是一個使用DBIRPostgres包的版本,並一次插入多行,因為這么多年過去了,仍然很難從文檔中找出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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM