【问题标题】:How to unittest PostGIS database queries with R如何使用 R 对 PostGIS 数据库查询进行单元测试
【发布时间】:2019-11-05 20:20:06
【问题描述】:

我一直在使用 R 中的数据库查询,这些查询在带有 PostGIS 扩展的 Postgres 数据库上执行。这意味着我使用了一些没有 R 等效项的 PostGIS 函数。如果不是这样,我可能只是在本地测试数据帧而不是数据库连接上执行相同的功能,但由于 PostGIS 功能,这是不可能的。

是否有一种简单的方法可以在测试数据库中创建测试数据并在其上运行查询并评估结果?我有一个 R 不直接支持的 WKB 列,所以我什至不确定一个简单的 copy_to 是否可以将字符向量插入几何列,更不用说解决潜在的键约束了。 本地 sqlite 数据库不起作用,因为它不提供这些功能。

有人找到了解决这个问题的可行方法吗?

【问题讨论】:

    标签: r postgresql postgis dbplyr


    【解决方案1】:

    听起来您无法将 postgresql 中的表收集回 R,因此您的比较必须在 sql 中进行。

    我会做以下事情:

    1. 定义文本字符串生成sql表
    2. 执行字符串生成表格
    3. 运行您的代码
    4. 进行比较

    为了在 sql 中比较两个表是否相同,我将遵循 this questionthis one 中的方法。

    这看起来像这样:

    # 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
    

    【讨论】:

    • 感谢您的回答!我不确定我是否理解正确,我 可以 将 PostGIS 数据检索到 R 中,但是一些争论需要在 SQL 中发生,我想检查这种争论是否以某种方式完成了它应该做的事情。
    • 在这种情况下,您可能仍然需要步骤 1-3 将测试数据写入 sql 并运行 sql 命令。但是您可以通过将数据收集回 R 并在那里测试输出来替换第 4 步。
    猜你喜欢
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多