BraMira / Mirjam-Spela

Projekt pri predmetu OPB 2015/2016
0 stars 4 forks source link

Baza #5

Closed BraMira closed 8 years ago

BraMira commented 8 years ago

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č.

jaanos commented 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.

BraMira commented 8 years ago

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?

jaanos commented 8 years ago

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.

BraMira commented 8 years ago

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.

jaanos commented 8 years ago

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.

BraMira commented 8 years ago

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.

jaanos commented 8 years ago

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.

BraMira commented 8 years ago

Še vedno javi napako.

jaanos commented 8 years ago

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:

BraMira commented 8 years ago

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?

jaanos commented 8 years ago

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.

spelapovrzenic commented 8 years ago

Ž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?

jaanos commented 8 years ago

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.