PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment écrire des données de R dans des tables PostgreSQL avec une clé primaire auto-incrémentée ?

Dans le fil de discussion du commentaire de hrbrmstr, j'ai trouvé un hack pour que cela fonctionne.

Dans le postgresqlWriteTable dans le RPostgreSQL package, vous devez remplacer la ligne

sql4 <- paste("COPY", postgresqlTableRef(name), "FROM STDIN")

avec

sql4 <- paste(
  "COPY ", 
  postgresqlTableRef(name), 
  "(", 
  paste(postgresqlQuoteId(names(value)), collapse = ","), 
  ") FROM STDIN"
)

Notez que la citation des variables (non incluses dans le hack d'origine) est nécessaire pour transmettre des noms de colonnes sensibles à la casse.

Voici un script pour le faire :

body_lines <- deparse(body(RPostgreSQL::postgresqlWriteTable))
new_body_lines <- sub(
  'postgresqlTableRef(name), "FROM STDIN")', 
  'postgresqlTableRef(name), "(", paste(shQuote(names(value)), collapse = ","), ") FROM STDIN")', 
  body_lines,
  fixed = TRUE
)
fn <- RPostgreSQL::postgresqlWriteTable
body(fn) <- parse(text = new_body_lines)
while("RPostgreSQL" %in% search()) detach("package:RPostgreSQL")
assignInNamespace("postgresqlWriteTable", fn, "RPostgreSQL")