#o ./ indica q o meu qmd está na mesma pasta q o dataset#esse if faz o código rodar se a cópia ainda não existir#ent ele retorna true se a cópia foi feita na hora e não retorna nada se a cópia#já tiver feita
db <-dbConnect(SQLite(), "./discoCopy.db") #conectando o r ao sql
dbListTables(db) #vendo quais tabelas estão no dataset
aname ="Gilberto Gil"sql =paste0("SELECT ArtistId FROM artists ","WHERE Name = '", aname, "'")aId =dbGetQuery(db, sql)sql =paste('SELECT Title FROM albums', 'WHERE ArtistId =', aId)dbGetQuery(db, sql)
Title
1 As Canções de Eu Tu Eles
2 Quanta Gente Veio Ver (Live)
3 Quanta Gente Veio ver--Bônus De Carnaval
#o código abaixo é um exemplo de como um usuário malicioso pode invadir o#dataset e modificá-lo, destruindo o banco de dados#aname <- "Gilberto Gil'; DROP TABLE 'albums"
#essas são funções q executam queries com segurançasql =paste("SELECT ArtistId FROM artists", "WHERE Name = ?")query <-dbSendQuery(db, sql)dbBind(query, list("Gilberto Gil"))aId <-dbFetch(query)dbClearResult(query)# Segundo passo interno, não deve causar problemasql =paste('SELECT Title FROM albums', 'WHERE ArtistId =', aId)dbGetQuery(db, sql)
Title
1 As Canções de Eu Tu Eles
2 Quanta Gente Veio Ver (Live)
3 Quanta Gente Veio ver--Bônus De Carnaval
dbListFields(db, 'instruments') #vendo as colunas de instruments
#note que o atributo rownames (marcas dos carros) foi perdido, mas há um#parâmetro row.names em dbWriteTabledbGetQuery(db, "SELECT * FROM mtcars") %>%head(3)
#os códigos abaixo lêem os dados em chunksres <-dbSendQuery(db, "SELECT * FROM mtcars WHERE cyl = 4")while(!dbHasCompleted(res)){chunk <-dbFetch(res, n =5)print(nrow(chunk))}
[1] 5
[1] 5
[1] 1
dbClearResult(res)
#encerrando as conexões com dbDisconnect() e removenedo a cópia q fizemos do#dataset disco.dbdbDisconnect(db)if("discoCopy.db"%in%list.files("../dados/")){file.remove("../dados/discoCopy.db")}
#criando uma base de dadosairports <-read_csv("./airports.csv", col_types ="cccccdd")airlines <-read_csv("./airlines.csv", col_types ="cc")air <-dbConnect(SQLite(), dbname ="./air.db")dbWriteTable(air, name ="airports", airports)dbWriteTable(air, name ="airlines", airlines)dbListTables(air)
[1] "airlines" "airports"
#destruindo a conexão e a tabeladbDisconnect(air)if("air.db"%in%list.files("./")){file.remove("./air.db")}
[1] TRUE
#o pacote dbplyr estende algumas funcionalidades do dplyr a dados que#estão armazenados em um bancos de dados externolibrary(dbplyr)
Attaching package: 'dbplyr'
The following objects are masked from 'package:dplyr':
ident, sql
db <-dbConnect(SQLite(), "./disco.db") #originaltracks <-tbl(db, "tracks") #dplyrtracks %>%head(3)
# Source: SQL [3 x 9]
# Database: sqlite 3.43.2 [\\smb\ra212974\Documentos\desafios\disco.db]
TrackId Name AlbumId MediaTypeId GenreId Composer Milliseconds Bytes
<int> <chr> <int> <int> <int> <chr> <int> <int>
1 1 For Those Ab… 1 1 1 Angus Y… 343719 1.12e7
2 2 Balls to the… 2 2 1 <NA> 342562 5.51e6
3 3 Fast As a Sh… 3 2 1 F. Balt… 230619 3.99e6
# ℹ 1 more variable: UnitPrice <dbl>
#esse código faz um resumo estatístico por álbum da tabela tracks com os#verbos do dplyr disponiveis, mas q secretamente são comandos de SQLitemeanTracks <- tracks %>%group_by(AlbumId) %>%summarise(AvLen =mean(Milliseconds, na.rm =TRUE),AvCost =mean(UnitPrice, na.rm =TRUE))meanTracks