Как тестировать запросы к базе данных PostGIS с помощью R

Я играл с запросами к базе данных в R, которые выполняются в базе данных Postgres с расширением PostGIS. Это означает, что я использую некоторые функции PostGIS, которые не имеют эквивалента R. Если бы не это, я, вероятно, мог бы просто выполнить ту же функцию на локальном тестовом фрейме данных вместо подключения к базе данных, но из-за функций PostGIS это невозможно.

Существует ли простой подход к созданию тестовых данных в тестовой базе данных, запуску запроса и оценке результата? У меня есть столбец WKB, который R не поддерживает напрямую, поэтому я даже не уверен, что простой copy_to может работать со вставкой вектора символов в столбец геометрии, не говоря уже о разрешении потенциальных ключевых ограничений. Локальная база данных sqlite не работает, потому что не предоставляет этих функций.

Кто-нибудь нашел жизнеспособное решение этой проблемы?


person telegott    schedule 05.11.2019    source источник


Ответы (1)


Похоже, вы не можете собирать таблицы из postgresql обратно в R, поэтому ваше сравнение должно происходить в sql.

Я бы сделал следующее:

  1. определить текстовые строки для создания таблиц sql
  2. выполнить строки для создания таблиц
  3. запусти свой код
  4. сделай свое сравнение

Для сравнения в sql, что две таблицы идентичны, я бы следовал методу в этот вопрос или этот.

Это будет выглядеть примерно так:

# Define text strings
create_string = 'CREATE TABLE test1 (code VARCHAR(4), size INTEGER);'
insert_string = 'INSERT INTO test1 (code, size) VALUES ('AAA', 123);'

# Execute strings
db_con = create_connection()
dbExecute(db_con, create_string)
dbExecute(db_con, insert_string)

# optional validate new table with contents now exists in datbase

# run code
test1 = tbl(db_con, "test1")
test2 = my_function_to_test_that_does_nothing(test1)

# comparison
num_records_not_in_both = test1 %>%
    full_join(test2, by = colnames(test2), suffix = c("_1","_2") %>%
    filter(is.na(id_1) | is.na(id_2)) %>%
    ungroup() %>%
    summarise(num = n()) %>%
    collect()
require(num_records_not_in_both == 0)

# optional delete test functions
person Simon.S.A.    schedule 06.11.2019
comment
Спасибо за ответ! Я не уверен, что правильно вас понял, я могу извлекать данные PostGIS в R, однако некоторые действия должны выполняться в SQL, и я хочу проверить, выполняет ли эти действия то, что должно. - person telegott; 08.11.2019
comment
В этом случае вы, вероятно, захотите, чтобы шаги 1-3 записали тестовые данные в sql и выполнили команды sql. Но вы можете заменить шаг 4, собрав данные обратно в R и проверив вывод там. - person Simon.S.A.; 09.11.2019