PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie schreibe ich Daten von R in PostgreSQL-Tabellen mit einem automatisch inkrementierenden Primärschlüssel?

Aus dem Thread in hrbrmstrs Kommentar habe ich einen Hack gefunden, um dies zum Laufen zu bringen.

In der postgresqlWriteTable im RPostgreSQL Paket, müssen Sie die Zeile

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

mit

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

Beachten Sie, dass das Zitieren von Variablen (nicht im ursprünglichen Hack enthalten) notwendig ist, um Spaltennamen zu übergeben, bei denen die Groß-/Kleinschreibung beachtet wird.

Hier ist ein Skript dafür:

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")