Z tym problemem też zmagam się od kilku miesięcy. Jednak natknąłem się na rozwiązanie, które również może Ci pomóc.
Krótko mówiąc, problem występuje, gdy niektóre kolumny tekstowe nie pojawiają się po kolumnach liczb całkowitych/liczbowych. Gdy kolumny nie są prawidłowo wyrównane w zapytaniu, pojawia się błąd invalid index
zostanie wyrzucony i połączenie może się zawiesić. W takim razie problem polega na tym, skąd mam wiedzieć, co umieścić na końcu zapytania?
Aby to ustalić, można zwykle zbadać kolumnę za pomocą class()
lub typeof()
. Aby zbadać takie informacje z bazy danych, możesz użyć zapytania, takiego jak:
dbColumnInfo(dbSendQuery(con, "SELECT * from schema.table")) # You may not require the schema part...
Spowoduje to zwrócenie tabeli z polem typu dla każdej kolumny w interesującym zestawie danych. Następnie możesz użyć tej tabeli jako indeksu do sortowania select()
oświadczenie. Moja szczególna trudność polega na tym, że type
pole w tabeli zawierało wszystkie liczby! Zauważyłem jednak, że każda kolumna z liczbą ujemną, umieszczona na końcu instrukcji select, poprawiła moje zapytanie i mogłem bez problemu wyciągnąć całą tabelę. Na przykład moje pełne rozwiązanie :
# 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)))
Jeśli chodzi o powód, dla którego tak się dzieje, nie jestem pewien i nie mam uprawnień dostępu do danych, aby kopać znacznie głębiej w moim przypadku użycia