S tímto problémem se také potýkám několik měsíců. Narazil jsem však na řešení, které může pomoci i vám.
Stručně řečeno, k problému dochází, když se určité textové sloupce nezobrazují po celočíselných nebo číselných sloupcích. Pokud nejsou sloupce v dotazu správně zarovnány, zobrazí se chyba invalid index
je vyhozen a vaše připojení může zamrznout. Otázkou tedy je, jak zjistím, co mám uvést na konec dotazu?
Chcete-li to zjistit, lze obvykle prozkoumat sloupec pomocí class()
nebo typeof()
. K prozkoumání takových informací z databáze můžete použít dotaz jako:
dbColumnInfo(dbSendQuery(con, "SELECT * from schema.table")) # You may not require the schema part...
Tím se vrátí tabulka s polem typu pro každý sloupec v souboru dat, který vás zajímá. Tuto tabulku pak můžete použít jako index k řazení select()
prohlášení. Můj konkrétní problém je v tom, že type
pole v tabulce byla všechna čísla! Všiml jsem si však, že každý sloupec se záporným číslem, když byl umístěn na konec příkazu select, opravil můj dotaz a mohl jsem v pohodě stáhnout celou tabulku. Například moje úplné řešení :
# Create my index of column types (ref to the current order)
index <- dbColumnInfo(dbSendQuery(con, "SELECT * from schema.table"))
index$type <- as.integer(index$type) # B/c they are + and - numbers!
# Create the ref to the table
mySQLTbl <- tbl(con, in_schema("schema", "tablename"))
# Use the select statement to put all the + numbered columns first!
mySQLTbl %>%
select(c(which(index$type>=0),
which(index$type<0)))
Pokud jde o důvod, proč k tomu dochází, nejsem si jistý a nemám oprávnění pro přístup k datům, abych se ve svém případu použití dostal mnohem hlouběji