2017-03-21 1 views
1

Ich versuche herauszufinden, wie Daten aus einer temporären Tabelle in einer Postgres-Datenbank mit dplyr abgerufen werden. Der folgende Code funktioniert (ich bin in der Lage, eine temporäre Tabelle mit R zu erstellen und diese Ergebnisse abzurufen).Verwenden von dplyr zum Erstellen und Abrufen von Daten aus temporären Postgres-Tabelle

flights.db <- src_postgres(dbname = dbname, host = host, port = port, 
          user = user, password=pwd) 
drv <- dbDriver("PostgreSQL") 
con <- dbConnect(drv, host = host, port = port, dbname = dbname, user = user, password = pwd) 

## Writes the SQL code to create a temporary table on the Postgres Database 
sql_tmp_create <- paste0('create temp table tmptblaa as 
       select * from connections 
       where \"Carrier\" = \'AA\' and \"Year\" = \'2015\' ') 

## Executes the code 
dbSendQuery(con, sql_tmp_create) 

## Return 10 results from temporary table on Postgres 
dbGetQuery(con, 'select * from tmptblaa limit 10') 

Dies ist jedoch für mich nicht funktioniert, und ich erhalte einen Fehler, dass die Tabelle nicht existiert:

flights <-tbl(flights.db, "tmptblaa") 

Alle Ideen, was ich könnte falsch machen? Für mehr Kontext ist dies, um die Effizienz einer Shiny App zu verbessern, an der ich für ein Schulprojekt arbeite. Vielen Dank.

Antwort

0

Das Problem mit temporären Tabellen ist, dass sie nur innerhalb einer Sitzung existieren, die mit einem Verbindungsobjekt initiiert wurde. Wenn Sie Ihre temporäre Tabelle mit dem obigen Code erstellen, kann die temporäre Tabelle nur mit dem Objekt con aufgerufen werden. dplyr erlaubt Ihnen nicht, Tabellen afaik zu erstellen, so dass ich fürchte, Sie können nicht tun, was Sie möchten.

Sie könnten jedoch eine materialisierte Ansicht in Betracht ziehen, falls Sie Vorräte in der db voraggregieren möchten. dplyr kann von einer materialisierten Ansicht abfragen, und da es persistent ist, ist es nicht notwendig, das mv mit dplyr zu erstellen. Sie können Daten aus einer materialisierten Ansicht abfragen, indem Sie z. con %>% tbl(sql("select * from my_mv")) %>% collect(n = Inf). Das wichtige Detail hier ist die sql Funktion, die Syntax unterscheidet sich leicht von regulären Tabellen.

+0

Danke. Dies ist der Fehler, den ich bekomme ... Flüge <-tbl (flights.db, sql ('wählen * von tmpaa')) Fehler in postgresqlExecStatement (conn, Anweisung, ...): RS-DBI-Treiber: (konnte das Ergebnis nicht abrufen: ERROR: Relation "tmpaa" existiert nicht LINE 1: SELECT * FROM (wähle * von tmpaa) "zzz38" WHERE 0 = 1 –

+0

Ah, mein Schlechter. Du hast Recht, es liegt an der Art der temporären Tabellen Ich habe meine Antwort aktualisiert – jess

+0

Danke! Die materialisierte Ansicht macht den Job! –

Verwandte Themen