Closed BraMira closed 8 years ago
Tabele brišeš z ukazom DROP TABLE
, npr.
dbSendQuery(conn,build_sql("DROP TABLE country_religion"))
Najprej briši tabele, na katere ne kaže nobena referenca, sicer brisanje ne bo mogoče.
Predlagam sicer, da si narediš eno funkcijo za ustvarjanje tabel in eno za brisanje (ter seveda še eno za dejanski uvoz podatkov). V vsaki naj bo celoten blok tryCatch
, vključno s povezovanjem na bazo in prekinitvijo povezave. Potem lahko te funkcije kličeš po potrebi.
Podatke, ki sem jih napisala, da naj jih uvozi, mi sicer uvozi, ampak se R vseeno nekaj pritožuje:
Error in postgresqlExecStatement(conn, statement, ...) : RS-DBI driver: (could not Retrieve the result : ERROR: cannot drop table attack because other objects depend on it DETAIL: constraint in_country_attack_fkey on table in_country depends on table attack HINT: Use DROP ... CASCADE to drop the dependent objects too. ) Error in postgresqlExecStatement(conn, statement, ...) : RS-DBI driver: (could not Retrieve the result : ERROR: cannot drop table continent because other objects depend on it DETAIL: constraint in_continent_continent_fkey on table in_continent depends on table continent HINT: Use DROP ... CASCADE to drop the dependent objects too. ) In addition: Warning message: In postgresqlQuickSQL(conn, statement, ...) : Could not create executeDROP TABLE "attack"
A moram kaj popraviti?
Izgleda, kot da tabele attack
ni pobrisalo, ker se tabela in_country
še vedno navezuje nanjo. Iz trenutne kode izgleda, kot da bi moralo delovati - razen, če so trenutne tabele še nekoliko drugačne in zaradi tega že izbris tabele in_country
ni uspel. V tem primeru svetujem, da tabele pobrišeš na roke v phppgadminu - potem lahko poskusiš dvakrat pognati svoj program, da vidiš, če ti vse lepo pobriše in znova uvozi.
Sem pobrisala na roke, koda sicer še vedno deluje, ampak napako mi še vedno javlja. V bistvu mi jo ne javi samo za tabelo attack
, ampak tudi za continent
in country
.
V napaki ti napiše, kje je težava - torej katera tabela (ali drugi objekt) ima referenco na tabelo, ki jo želiš pobrisati. Pazi torej, da tisto prej pobrišeš.
Ena možnost je sicer, da uporabiš še določilo CASCADE
, npr.
DROP TABLE attack CASCADE;
To ti bo pobrisalo tabelo attack
ter vse ostale tabele in objekte, ki se nanjo navezujejo. Seveda velja ob uporabi tega določila biti posebej pozorni.
Probala sem že vse možne načine, tudi CASCADE
, in vedno mi javi napako. Tudi, če dam attack
na prvo mesto, mi javi, da so drugi objekti od njega odvisni.
Sem uporabil svoje zlobne moči in sam pognal ukaze DROP TABLE
v vrstnem redu kot v sql.R
(commit 70db48ef), pa je lepo vse pobrisalo brez napak. Poskusi pognati še enkrat - zanima me, če bo še vedno prihajalo do napak.
Še vedno javi napako.
Sem poskusil sedaj pognati na svoji kopiji baze. Problem sploh ni v ukazih DROP TABLE
, pač pa pri dbWriteTable
. Ta privzeto namreč tudi ustvari tabelo, s parametrom overwrite=T
pa jo pred tem poskusi tudi pobrisati (od tod napaka). Bolje bo, če namesto tega parametra uporabiš append=T
, da se bodo podatki samo dodali v obstoječe tabele.
Še nekaj opomb:
4.Baza
, tako da veliko začetnico podaj tudi pri vključevanju auth.R
.fileEncoding = "Windows-1250"
).DATE
. Datume v R-ju zapiši v obliki "YYYY-MM-DD"
- lahko jih potem še pretvoriš s funkcijo as.Date()
(čeprav mislim, da to na bo nujno potrebno).confirmed
v tabeli attack
naj bo tipa BOOLEAN
; nize "YES"
in "NO"
pretvori v TRUE
in FALSE
.injured
naj bo tipa INTEGER
- podatke bo treba še nekoliko prečistiti (in morda dodati še kak stolpec, če ne želiš izgubiti počiščenih informacij).Imela bi še eno vprašanja, spet v datoteki sql.R
in sicer mi v vrstici 91 (drzave<-read.csv...)
, po tem ko poženem program, napiše:
Browse[1]> n debug at C:/Users/Mirjam/Desktop/FAKS/3. letnik/OPB/Teroristi/4.Baza/sql.R#91: drzave <- read.csv("3.Podatki/drzave.csv", fileEncoding = "Windows-1250") Browse[2]>
in moram potem klikniti Continue, če hočem, da se do konca izvede. Kaj je vbistvu narobe napisano, da se to dogaja?
Nič ni narobe - najbrž si po nesreči kliknila levo od vrstice 91, kjer se pojavi rdeča pika - tako se izvajanje tam ustavi, da lahko analiziraš, kaj se tam dogaja. Če klikneš na rdečo piko, bo izginila, program pa se bo normalno izvajal.
Živjo, zanima naju kako sedaj vstaviva podatke v relacije.
Za relacijo country_religion
sve vbistvu naredile tabelo religion
, in ta relacija bi vbistvu tako zgledala, razen v stolcpu name
bi bile številke, ki bi predstavljale religion_id
. A vbistvu lahko relacijo tako iz csv vstavimo ali je potrebno vse ročno napisati?
Potrebno bo pridobiti ustrezne ID-je za vsako religijo. Najlažje se to naredi s pomočjo dplyr:
con <- src_postgres(dbname = db, host = host, user = user, password = password)
tbl.religion <- tbl(con, "religion")
data.country_religion <- inner_join(religion,
tbl.religion %>% select(religion_id, name),
copy = TRUE) %>%
select(country, main_religion = religion_id, followers, proportion)
Parameter copy = TRUE
je potreben zato, ker sta podatkovna vira različna (lokalna razpredelnica oziroma tabela v bazi), tako da je potrebno enega skopirati k drugemu, da se opravi združevanje. Ker je tabela religion
v bazi majhna, se jo torej bolj izplača prenesti pred združevanjem (prenese se tista tabela, ki je podana druga). Po izvedbi zadnjega ukaza bodo v razpredelnici data.country_religion
ustrezni podatki za vstavljanje v bazo, tako da jih lahko vstavita na isti način kot ostale podatke.
Mene pa zanima kako v datoteki
sql.r
na začetku napišem, da se tabele, ki so že v bazi zbrišejo in pa kako se sedaj vstavlja podatke v te tabele.Hvala za pomoč.