rlowdb
is a lightweight, JSON-based database for R,
inspired by LowDB from
JavaScript. It provides a simple and efficient way to store, retrieve,
update, and delete structured data without the need for a full database
system.
You can install rlowdb
from CRAN
with:
install.packages("rlowdb")
You can also install the development version from Github
with:
::install_github("feddelegrand7/rlowdb") devtools
To start using `rlowdb``, create a new database instance by specifying a JSON file:
library(rlowdb)
<- rlowdb$new("DB.json") db
The insert
method takes two parameters, a
collection
and a record
, think of the
collection
parameter as a table
in the
SQL world. Think of the record
parameter
as a list
of names, each name/value pair representing a
specific column and it’s value.
Add records to a collection:
$insert(
dbcollection = "users",
record = list(id = 1, name = "Ali", age = 30)
)$insert(
dbcollection = "users",
record = list(id = 2, name = "Bob", age = 25)
)
$insert(
dbcollection = "users",
record = list(id = 3, name = "Alice", age = 30)
)
Using the transaction
method, you can insert a set of
records and if an error occurs in the process, a rollback
will be triggered to restore the initial state of the database. Note
that the insertion has to be operated using a function:
$count("users")
db#> [1] 3
$transaction(function() {
db$insert("users", list(name = "Zlatan", age = 40))
db$insert("users", list(name = "Neymar", age = 28))
dbstop("some errors")
$insert("users", list(name = "Ronaldo", age = 30))
db
})#> Error in `value[[3L]]()`:
#> ! Transaction failed: some errors
$count("users")
db#> [1] 3
Get all stored data:
$get_data()
db#> $users
#> $users[[1]]
#> $users[[1]]$id
#> [1] 1
#>
#> $users[[1]]$name
#> [1] "Ali"
#>
#> $users[[1]]$age
#> [1] 30
#>
#>
#> $users[[2]]
#> $users[[2]]$id
#> [1] 2
#>
#> $users[[2]]$name
#> [1] "Bob"
#>
#> $users[[2]]$age
#> [1] 25
#>
#>
#> $users[[3]]
#> $users[[3]]$id
#> [1] 3
#>
#> $users[[3]]$name
#> [1] "Alice"
#>
#> $users[[3]]$age
#> [1] 30
Get data from a specific collection:
$get_data_collection("users")
db#> [[1]]
#> [[1]]$id
#> [1] 1
#>
#> [[1]]$name
#> [1] "Ali"
#>
#> [[1]]$age
#> [1] 30
#>
#>
#> [[2]]
#> [[2]]$id
#> [1] 2
#>
#> [[2]]$name
#> [1] "Bob"
#>
#> [[2]]$age
#> [1] 25
#>
#>
#> [[3]]
#> [[3]]$id
#> [1] 3
#>
#> [[3]]$name
#> [1] "Alice"
#>
#> [[3]]$age
#> [1] 30
Get data from a specific key:
$get_data_key("users", "name")
db#> [1] "Ali" "Bob" "Alice"
Find a specific record:
$find(collection = "users", key = "id", value = 1)
db#> [[1]]
#> [[1]]$id
#> [1] 1
#>
#> [[1]]$name
#> [1] "Ali"
#>
#> [[1]]$age
#> [1] 30
Modify existing records:
$update(
dbcollection = "users",
key = "id",
value = 1,
new_data = list(age = 31)
)
$get_data()
db#> $users
#> $users[[1]]
#> $users[[1]]$id
#> [1] 1
#>
#> $users[[1]]$name
#> [1] "Ali"
#>
#> $users[[1]]$age
#> [1] 31
#>
#>
#> $users[[2]]
#> $users[[2]]$id
#> [1] 2
#>
#> $users[[2]]$name
#> [1] "Bob"
#>
#> $users[[2]]$age
#> [1] 25
#>
#>
#> $users[[3]]
#> $users[[3]]$id
#> [1] 3
#>
#> $users[[3]]$name
#> [1] "Alice"
#>
#> $users[[3]]$age
#> [1] 30
The upsert
methods allows you to update a record if it
exists, otherwise, it will be inserted. Note that the collection and the
key need to exist:
$upsert(
dbcollection = "users",
key = "id",
value = 1,
new_data = list(age = 25)
)
$get_data()
db#> $users
#> $users[[1]]
#> $users[[1]]$id
#> [1] 1
#>
#> $users[[1]]$name
#> [1] "Ali"
#>
#> $users[[1]]$age
#> [1] 25
#>
#>
#> $users[[2]]
#> $users[[2]]$id
#> [1] 2
#>
#> $users[[2]]$name
#> [1] "Bob"
#>
#> $users[[2]]$age
#> [1] 25
#>
#>
#> $users[[3]]
#> $users[[3]]$id
#> [1] 3
#>
#> $users[[3]]$name
#> [1] "Alice"
#>
#> $users[[3]]$age
#> [1] 30
$upsert(
dbcollection = "users",
key = "id",
value = 100,
new_data = list(age = 25)
)
$get_data()
db#> $users
#> $users[[1]]
#> $users[[1]]$id
#> [1] 1
#>
#> $users[[1]]$name
#> [1] "Ali"
#>
#> $users[[1]]$age
#> [1] 25
#>
#>
#> $users[[2]]
#> $users[[2]]$id
#> [1] 2
#>
#> $users[[2]]$name
#> [1] "Bob"
#>
#> $users[[2]]$age
#> [1] 25
#>
#>
#> $users[[3]]
#> $users[[3]]$id
#> [1] 3
#>
#> $users[[3]]$name
#> [1] "Alice"
#>
#> $users[[3]]$age
#> [1] 30
#>
#>
#> $users[[4]]
#> $users[[4]]$id
#> [1] 100
#>
#> $users[[4]]$age
#> [1] 25
$delete(collection = "users", key = "id", value = 100)
db
$get_data()
db#> $users
#> $users[[1]]
#> $users[[1]]$id
#> [1] 1
#>
#> $users[[1]]$name
#> [1] "Ali"
#>
#> $users[[1]]$age
#> [1] 25
#>
#>
#> $users[[2]]
#> $users[[2]]$id
#> [1] 2
#>
#> $users[[2]]$name
#> [1] "Bob"
#>
#> $users[[2]]$age
#> [1] 25
#>
#>
#> $users[[3]]
#> $users[[3]]$id
#> [1] 3
#>
#> $users[[3]]$name
#> [1] "Alice"
#>
#> $users[[3]]$age
#> [1] 30
You can insert many records at once using the
buld_insert
method:
$bulk_insert("users", list(
dblist(id = 1, name = "Antoine", age = 52),
list(id = 2, name = "Omar", age = 23),
list(id = 3, name = "Nabil", age = 41)
))
Find users older than 25:
$query(collection = "users", condition = "age > 25")
db#> [[1]]
#> [[1]]$id
#> [1] 3
#>
#> [[1]]$name
#> [1] "Alice"
#>
#> [[1]]$age
#> [1] 30
#>
#>
#> [[2]]
#> [[2]]$id
#> [1] 1
#>
#> [[2]]$name
#> [1] "Antoine"
#>
#> [[2]]$age
#> [1] 52
#>
#>
#> [[3]]
#> [[3]]$id
#> [1] 3
#>
#> [[3]]$name
#> [1] "Nabil"
#>
#> [[3]]$age
#> [1] 41
Query with multiple conditions:
$query(collection = "users", condition = "age > 20 & id > 1")
db#> [[1]]
#> [[1]]$id
#> [1] 2
#>
#> [[1]]$name
#> [1] "Bob"
#>
#> [[1]]$age
#> [1] 25
#>
#>
#> [[2]]
#> [[2]]$id
#> [1] 3
#>
#> [[2]]$name
#> [1] "Alice"
#>
#> [[2]]$age
#> [1] 30
#>
#>
#> [[3]]
#> [[3]]$id
#> [1] 2
#>
#> [[3]]$name
#> [1] "Omar"
#>
#> [[3]]$age
#> [1] 23
#>
#>
#> [[4]]
#> [[4]]$id
#> [1] 3
#>
#> [[4]]$name
#> [1] "Nabil"
#>
#> [[4]]$age
#> [1] 41
The filter
method allows you to apply a predicate
function (a function that returns TRUE
or
FALSE
) in order to get a specific set of records:
$filter("users", function(x) {
db$age > 30
x
})#> [[1]]
#> [[1]]$id
#> [1] 1
#>
#> [[1]]$name
#> [1] "Antoine"
#>
#> [[1]]$age
#> [1] 52
#>
#>
#> [[2]]
#> [[2]]$id
#> [1] 3
#>
#> [[2]]$name
#> [1] "Nabil"
#>
#> [[2]]$age
#> [1] 41
The search
method allows you to search within
character
fields a specific record. You can also use
regex
:
$search("users", "name", "^Ali", ignore.case = FALSE)
db#> [[1]]
#> [[1]]$id
#> [1] 1
#>
#> [[1]]$name
#> [1] "Ali"
#>
#> [[1]]$age
#> [1] 25
#>
#>
#> [[2]]
#> [[2]]$id
#> [1] 3
#>
#> [[2]]$name
#> [1] "Alice"
#>
#> [[2]]$age
#> [1] 30
$search("users", "name", "alice", ignore.case = TRUE)
db#> [[1]]
#> [[1]]$id
#> [1] 3
#>
#> [[1]]$name
#> [1] "Alice"
#>
#> [[1]]$age
#> [1] 30
The list_collections
method returns the names of the
collections within your DB:
$list_collections()
db#> [1] "users"
Using the count
method, you can get the number of
records a collection has:
$count(collection = "users")
db#> [1] 6
It possible to verify if a collection
, a
key
or a value
exists within your
DB
:
$exists_collection(collection = "users")
db#> [1] TRUE
$exists_collection(collection = "nonexistant")
db#> [1] FALSE
$exists_key(collection = "users", key = "name")
db#> [1] TRUE
$exists_value(
dbcollection = "users",
key = "name",
value = "Alice"
)#> [1] TRUE
$exists_value(
dbcollection = "users",
key = "name",
value = "nonexistant"
)#> [1] FALSE
Using the status
method, you can at each time get some
valuable information about the state of your DB
:
$status()
db#> - database path: DB.json
#> - database exists: TRUE
#> - auto_commit: TRUE
#> - verbose: FALSE
#> - collections: users
#> - schemas: No schema defined
It is possible to clear
a collection. This will remove
all the elements belonging to the collection but not drop the collection
it self:
$insert(collection = "countries", record = list(id = 1, country = "Algeria", continent = "Africa"))
db
$insert(collection = "countries", record = list(id = 1, country = "Germany", continent = "Europe"))
db
$get_data()
db#> $users
#> $users[[1]]
#> $users[[1]]$id
#> [1] 1
#>
#> $users[[1]]$name
#> [1] "Ali"
#>
#> $users[[1]]$age
#> [1] 25
#>
#>
#> $users[[2]]
#> $users[[2]]$id
#> [1] 2
#>
#> $users[[2]]$name
#> [1] "Bob"
#>
#> $users[[2]]$age
#> [1] 25
#>
#>
#> $users[[3]]
#> $users[[3]]$id
#> [1] 3
#>
#> $users[[3]]$name
#> [1] "Alice"
#>
#> $users[[3]]$age
#> [1] 30
#>
#>
#> $users[[4]]
#> $users[[4]]$id
#> [1] 1
#>
#> $users[[4]]$name
#> [1] "Antoine"
#>
#> $users[[4]]$age
#> [1] 52
#>
#>
#> $users[[5]]
#> $users[[5]]$id
#> [1] 2
#>
#> $users[[5]]$name
#> [1] "Omar"
#>
#> $users[[5]]$age
#> [1] 23
#>
#>
#> $users[[6]]
#> $users[[6]]$id
#> [1] 3
#>
#> $users[[6]]$name
#> [1] "Nabil"
#>
#> $users[[6]]$age
#> [1] 41
#>
#>
#>
#> $countries
#> $countries[[1]]
#> $countries[[1]]$id
#> [1] 1
#>
#> $countries[[1]]$country
#> [1] "Algeria"
#>
#> $countries[[1]]$continent
#> [1] "Africa"
#>
#>
#> $countries[[2]]
#> $countries[[2]]$id
#> [1] 1
#>
#> $countries[[2]]$country
#> [1] "Germany"
#>
#> $countries[[2]]$continent
#> [1] "Europe"
Now, look what happened when we use the clear
method on
the countries
collection:
$clear("countries")
db
$get_data()
db#> $users
#> $users[[1]]
#> $users[[1]]$id
#> [1] 1
#>
#> $users[[1]]$name
#> [1] "Ali"
#>
#> $users[[1]]$age
#> [1] 25
#>
#>
#> $users[[2]]
#> $users[[2]]$id
#> [1] 2
#>
#> $users[[2]]$name
#> [1] "Bob"
#>
#> $users[[2]]$age
#> [1] 25
#>
#>
#> $users[[3]]
#> $users[[3]]$id
#> [1] 3
#>
#> $users[[3]]$name
#> [1] "Alice"
#>
#> $users[[3]]$age
#> [1] 30
#>
#>
#> $users[[4]]
#> $users[[4]]$id
#> [1] 1
#>
#> $users[[4]]$name
#> [1] "Antoine"
#>
#> $users[[4]]$age
#> [1] 52
#>
#>
#> $users[[5]]
#> $users[[5]]$id
#> [1] 2
#>
#> $users[[5]]$name
#> [1] "Omar"
#>
#> $users[[5]]$age
#> [1] 23
#>
#>
#> $users[[6]]
#> $users[[6]]$id
#> [1] 3
#>
#> $users[[6]]$name
#> [1] "Nabil"
#>
#> $users[[6]]$age
#> [1] 41
#>
#>
#>
#> $countries
#> list()
Using the drop
method, one can drop a whole
collection:
$drop(collection = "countries")
db$get_data()
db#> $users
#> $users[[1]]
#> $users[[1]]$id
#> [1] 1
#>
#> $users[[1]]$name
#> [1] "Ali"
#>
#> $users[[1]]$age
#> [1] 25
#>
#>
#> $users[[2]]
#> $users[[2]]$id
#> [1] 2
#>
#> $users[[2]]$name
#> [1] "Bob"
#>
#> $users[[2]]$age
#> [1] 25
#>
#>
#> $users[[3]]
#> $users[[3]]$id
#> [1] 3
#>
#> $users[[3]]$name
#> [1] "Alice"
#>
#> $users[[3]]$age
#> [1] 30
#>
#>
#> $users[[4]]
#> $users[[4]]$id
#> [1] 1
#>
#> $users[[4]]$name
#> [1] "Antoine"
#>
#> $users[[4]]$age
#> [1] 52
#>
#>
#> $users[[5]]
#> $users[[5]]$id
#> [1] 2
#>
#> $users[[5]]$name
#> [1] "Omar"
#>
#> $users[[5]]$age
#> [1] 23
#>
#>
#> $users[[6]]
#> $users[[6]]$id
#> [1] 3
#>
#> $users[[6]]$name
#> [1] "Nabil"
#>
#> $users[[6]]$age
#> [1] 41
Finally, drop_all
will drop all the
collections
within your DB
:
$drop_all()
db$get_data()
db#> named list()
You can create at any time a backup for your database using the
backup
method:
$backup("DB_backup.json") db
You can restore a backup database or any preexisting DB using the
restore
method:
$restore("DB_backup.json") db
rlowdb
provides error handling for common issues. For
example, attempting to update a collection that does not exist will
result in an informative error:
$update(
dbcollection = "nonexistant",
key = "id",
value = 1,
new_data = list(age = 40)
) #> Error in `private$.find_index_by_key()` at rlowdb/R/main.R:207:7:
#> ! Error: Collection 'nonexistant' does not exist.
Please note that the ralger project is released with a Contributor Code of Conduct. By contributing to this project, you agree to abide by its terms.