2017-10-31 1 views
2

Ich erstelle eine Datenbank mit R-Paket dbplyr, mit RSQLite, aber meine Datenbank ist Null-Bytes in der Größe auf der Festplatte trotz meiner Schreiben (und Lesen) einer Tabelle. Hier ist mein Skript:Wie speichere ich Daten in meine RSQLite-Datenbank?

library("RSQLite") 
library("dbplyr") 
library("dplyr") 

data(mtcars) 

con <- DBI::dbConnect(RSQLite::SQLite(), dbname = "./mtcars.db") 
copy_to(con, mtcars, "mtcars") 

print(tbl(con, "mtcars")) 

Aber wie Sie aus dem ls -l am Ende meiner Datenbank Größe 0 sehen, obwohl das Drehbuch gelesen hat mtcars aus der Datenbank (so ist es da drin). Ich möchte die Datenbankdatei verwenden, um Daten mit einem anderen Programm zu teilen. Wie speichere ich die Daten regelmäßig auf die Festplatte?

[email protected]:~/scratch$ R -f dplysqlite.r 

R version 3.2.3 (2015-12-10) -- "Wooden Christmas-Tree" 
Copyright (C) 2015 The R Foundation for Statistical Computing 
Platform: x86_64-pc-linux-gnu (64-bit) 

R is free software and comes with ABSOLUTELY NO WARRANTY. 
You are welcome to redistribute it under certain conditions. 
Type 'license()' or 'licence()' for distribution details. 

    Natural language support but running in an English locale 

R is a collaborative project with many contributors. 
Type 'contributors()' for more information and 
'citation()' on how to cite R or R packages in publications. 

Type 'demo()' for some demos, 'help()' for on-line help, or 
'help.start()' for an HTML browser interface to help. 
Type 'q()' to quit R. 

> 
> library("RSQLite") 
> library("dbplyr") 
Warning messages: 
1: replacing previous import by ‘rlang::enquo’ when loading ‘dbplyr’ 
2: replacing previous import by ‘rlang::quo’ when loading ‘dbplyr’ 
3: replacing previous import by ‘rlang::quos’ when loading ‘dbplyr’ 
4: replacing previous import by ‘rlang::quo_name’ when loading ‘dbplyr’ 
> library("dplyr") 

Attaching package: ‘dplyr’ 

The following objects are masked from ‘package:dbplyr’: 

    ident, sql 

The following objects are masked from ‘package:stats’: 

    filter, lag 

The following objects are masked from ‘package:base’: 

    intersect, setdiff, setequal, union 

> 
> data(mtcars) 
> 
> con <- DBI::dbConnect(RSQLite::SQLite(), dbname = "./mtcars.db") 
> copy_to(con, mtcars, "mtcars") 
> 
> print(tbl(con, "mtcars")) 
# Source: table<mtcars> [?? x 11] 
# Database: sqlite 3.19.3 [/home/tbrowne/scratch/mtcars.db] 
    mpg cyl disp hp drat wt qsec vs am gear carb 
    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 
1 21.0  6 160.0 110 3.90 2.620 16.46  0  1  4  4 
2 21.0  6 160.0 110 3.90 2.875 17.02  0  1  4  4 
3 22.8  4 108.0 93 3.85 2.320 18.61  1  1  4  1 
4 21.4  6 258.0 110 3.08 3.215 19.44  1  0  3  1 
5 18.7  8 360.0 175 3.15 3.440 17.02  0  0  3  2 
6 18.1  6 225.0 105 2.76 3.460 20.22  1  0  3  1 
7 14.3  8 360.0 245 3.21 3.570 15.84  0  0  3  4 
8 24.4  4 146.7 62 3.69 3.190 20.00  1  0  4  2 
9 22.8  4 140.8 95 3.92 3.150 22.90  1  0  4  2 
10 19.2  6 167.6 123 3.92 3.440 18.30  1  0  4  4 
# ... with more rows 
> 
> 
[email protected]:~/scratch$ ls -l 
total 4 
-rw-rw-r-- 1 tbrowne tbrowne 194 Oct 31 11:04 dplysqlite.r 
-rw-r--r-- 1 tbrowne tbrowne 0 Oct 31 11:04 mtcars.db 

Antwort

2

Sie verwenden nicht die vom RSQLite documentation vorgeschlagenen Muster. Diese Dokumentation verwendet dbWriteTable einen Datenrahmen in eine SQLite-Tabelle zu kopieren:

dbWriteTable(con, "mtcars", mtcars) 

Nach dieser Dokumentation, Ihr vollständiger Code in etwa so aussehen würde:

con <- dbConnect(RSQLite::SQLite(), "./mtcars.db") 
data(mtcars) 
dbWriteTable(con, "mtcars", mtcars) 
dbListTables(con) 
# Fetch all query results into a data frame: 
dbGetQuery(con, "SELECT * FROM mtcars") 
+0

Lustig genug benutze ich tatsächlich die vorgeschlagene dplyrr Art, Tabellen zu schreiben. Ich schätze, ich sollte direkt zum Fahrer gehen, anstatt sich auf dplyr zu verlassen. –

+0

@ThomasBrowne Ich habe das auch vermutet, weshalb ich vermute, dass du vielleicht Recht hattest und es eine Art Flush gibt ... aber das käme auch von 'dplyr', da die SQLite-Dokumentation nichts davon erwähnt. –

2

Die copy_to() Methode für dbplyr Quellen (dbplyr:::copy_to.src_sql()) hat ein temporary Argument, das standardmäßig auf TRUE gesetzt ist. Dies bedeutet, dass die neue Tabelle nur für Ihre aktive Verbindung sichtbar ist und nach dem Schließen der Verbindung nicht mehr angezeigt wird. Folgendes sollte wie erwartet funktionieren:

copy_to(con, mtcars, "mtcars", temporary = FALSE) 

Alternativ verwenden dbWriteTable() wie Tim vermuten lässt.

Verwandte Themen