Как выполнить тестирование запросов к базе данных PostGIS с помощью R - PullRequest
0 голосов
/ 05 ноября 2019

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

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

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

1 Ответ

0 голосов
/ 06 ноября 2019

Похоже, вы не можете собирать таблицы из 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
...