Skip to content

createSSURGO() updates#401

Merged
brownag merged 8 commits into
masterfrom
createSSURGO2
Aug 6, 2025
Merged

createSSURGO() updates#401
brownag merged 8 commits into
masterfrom
createSSURGO2

Conversation

@brownag

@brownag brownag commented Aug 6, 2025

Copy link
Copy Markdown
Member

Also, corrects some other situations:

  • Using filename and conn with SQLite driver with .sqlite rather than .gpkg output
  • Better handling of missing export files, with better messages when quiet=FALSE
  • Skip executing commands that rely on a table being present (empty SSURGO export files currently can leaves gaps in the database)
library(soilDB)
library(RSQLite)

base_dir <- "D:/workspace/scratch"
.exdir1 <- file.path(base_dir, "ssurgo", "ssurgo1")
.exdir2 <- file.path(base_dir, "ssurgo", "ssurgo2")

# # download a single SSA
# downloadSSURGO(areasymbols = "ca113", destdir = .exdir1, include_template = FALSE, extract = TRUE, remove_zip = TRUE, db = "SSURGO")
# 
# # download another SSA in a different directory
# downloadSSURGO(areasymbols = "ca654", destdir = .exdir2, include_template = FALSE, extract = TRUE, remove_zip = TRUE, db = "SSURGO")

# init DB file, delete if already existing
.dbfile1 <- file.path(base_dir, "ssurgo1.sqlite")
unlink(.dbfile1)

# init SQLite DB with CA113
createSSURGO(filename = .dbfile1, exdir = .exdir1, include_spatial = FALSE, overwrite = TRUE, quiet = FALSE)
#> Loading required namespace: sf

# append existing SQLite DB with CA654
createSSURGO(filename = .dbfile1, exdir = .exdir2, include_spatial = FALSE, overwrite = FALSE, quiet = TRUE)
#> Error: File 'D:/workspace/scratch/ssurgo1.sqlite' exists and overwrite = FALSE

soilDB::SDA_query("SELECT DISTINCT areasymbol FROM legend ;", .dbfile1)
#>   areasymbol
#> 1      CA113

# init DB file, delete if already existing
.dbfile2 <- file.path(base_dir, "ssurgo2.sqlite")
unlink(.dbfile2)

# init SQLite DB with CA113 and CA654
createSSURGO(filename = .dbfile2, exdir = dirname(.exdir1), include_spatial = FALSE, overwrite = TRUE, quiet = TRUE)

soilDB::SDA_query("SELECT DISTINCT areasymbol FROM legend ;", .dbfile2)
#>   areasymbol
#> 1      CA113
#> 2      CA654

@brownag brownag self-assigned this Aug 6, 2025
@brownag brownag marked this pull request as ready for review August 6, 2025 18:31
@brownag

brownag commented Aug 6, 2025

Copy link
Copy Markdown
Member Author

Added append argument and added a bit more to the special cases of the sdv* and mds* tables which you only need one instance of.

library(soilDB)
library(RSQLite)

base_dir <- "D:/workspace/scratch"
.exdir1 <- file.path(base_dir, "ssurgo", "ssurgo1")
.exdir2 <- file.path(base_dir, "ssurgo", "ssurgo2")

# # download a single SSA
# downloadSSURGO(areasymbols = "ca113", destdir = .exdir1, include_template = FALSE, extract = TRUE, remove_zip = TRUE, db = "SSURGO")
# 
# # download another SSA in a different directory
# downloadSSURGO(areasymbols = "ca654", destdir = .exdir2, include_template = FALSE, extract = TRUE, remove_zip = TRUE, db = "SSURGO")

# init DB file, delete if already existing
.dbfile1 <- file.path(base_dir, "ssurgo1.sqlite")
unlink(.dbfile1)

# init SQLite DB with CA113
createSSURGO(filename = .dbfile1, exdir = .exdir1, include_spatial = FALSE, overwrite = TRUE, quiet = FALSE)
#> Loading required namespace: sf
#> File D:/workspace/scratch/ssurgo/ssurgo1/CA113/tabular/cfprodo.txt contains no data
#> File D:/workspace/scratch/ssurgo/ssurgo1/CA113/tabular/chtext.txt contains no data
#> File D:/workspace/scratch/ssurgo/ssurgo1/CA113/tabular/cpwndbrk.txt contains no data
#> File D:/workspace/scratch/ssurgo/ssurgo1/CA113/tabular/csmormr.txt contains no data
#> File D:/workspace/scratch/ssurgo/ssurgo1/CA113/tabular/cstemp.txt contains no data
#> File D:/workspace/scratch/ssurgo/ssurgo1/CA113/tabular/ltext.txt contains no data
#> File D:/workspace/scratch/ssurgo/ssurgo1/CA113/tabular/mutext.txt contains no data

# this "works" (appending three tables we just inserted) but fails uniqueness constraints so nothing happens
createSSURGO(filename = .dbfile1, exdir = .exdir1,
             include_tabular = c("legend", "mapunit", "component"),
             include_spatial = FALSE, append = TRUE, quiet = FALSE)
#> Error : UNIQUE constraint failed: component.cokey
#> Error : UNIQUE constraint failed: legend.lkey
#> Error : UNIQUE constraint failed: mapunit.mukey

# try to write to existing SQLite DB with CA654 [error because file exists]
createSSURGO(filename = .dbfile1, exdir = .exdir2, include_spatial = FALSE, overwrite = FALSE, quiet = FALSE)
#> Error: File 'D:/workspace/scratch/ssurgo1.duckdb' exists and overwrite=FALSE; use append=TRUE to append to an existing file

# append existing SQLite DB with CA654 [no uniqueness issues with metadata tables]
createSSURGO(filename = .dbfile1, exdir = .exdir2, include_spatial = FALSE, append = TRUE, quiet = FALSE)
#> File D:/workspace/scratch/ssurgo/ssurgo2/CA654/tabular/ccancov.txt contains no data
#> File D:/workspace/scratch/ssurgo/ssurgo2/CA654/tabular/cfprodo.txt contains no data
#> File D:/workspace/scratch/ssurgo/ssurgo2/CA654/tabular/chtext.txt contains no data
#> File D:/workspace/scratch/ssurgo/ssurgo2/CA654/tabular/cstemp.txt contains no data
#> File D:/workspace/scratch/ssurgo/ssurgo2/CA654/tabular/ltext.txt contains no data
#> File D:/workspace/scratch/ssurgo/ssurgo2/CA654/tabular/mutext.txt contains no data

soilDB::SDA_query("SELECT DISTINCT areasymbol FROM legend ;", .dbfile1)
#>   areasymbol
#> 1      CA113
#> 2      CA654

@brownag brownag merged commit 99bc56e into master Aug 6, 2025
5 checks passed
brownag added a commit that referenced this pull request Aug 13, 2025
 - geopackage case need to create gpkg_* tables via sf call, handle existing connection
brownag added a commit that referenced this pull request Aug 13, 2025
@brownag brownag deleted the createSSURGO2 branch November 18, 2025 22:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

createSSURGO() does not append records when overwrite = FALSE

1 participant