Skip to main content

SQLite Usage Guide with db2rest

This guide provides detailed examples of using db2rest with SQLite database, covering all CRUD operations, advanced querying, and special features.

Base URL Structure​

All SQLite API endpoints follow this pattern:

http://localhost:8080/v1/{dbId}/{tableName}

Where:

  • dbId: Database identifier (e.g., sqlitedb)
  • tableName: Target table name

Create Operations (POST)​

Basic Record Creation​

Create a new film record:

curl -X POST http://localhost:8080/v1/sqlitedb/film \
-H "Content-Type: application/json" \
-d '{
"title": "ACADEMY DINOSAUR",
"description": "A Epic Drama of a Feminist And a Mad Scientist",
"release_year": 2006,
"language_id": 1,
"rental_duration": 6,
"rental_rate": 0.99,
"length": 86,
"replacement_cost": 20.99,
"rating": "PG",
"special_features": "Deleted Scenes,Behind the Scenes"
}'

Response:

{
"row": 1,
"keys": {
"film_id": 1001
}
}

Create with Subset of Columns​

Create a film with only specific columns:

curl -X POST "http://localhost:8080/v1/sqlitedb/film?columns=title,description,language_id" \
-H "Content-Type: application/json" \
-d '{
"title": "NEW MOVIE",
"description": "A great movie",
"language_id": 1,
"extra_field": "ignored"
}'

Create Actor​

curl -X POST http://localhost:8080/v1/sqlitedb/actor \
-H "Content-Type: application/json" \
-d '{
"first_name": "JOHN",
"last_name": "DOE"
}'

Response:

{
"row": 1,
"keys": {
"actor_id": 201
}
}

Create Employee with Boolean Field​

curl -X POST http://localhost:8080/v1/sqlitedb/employee \
-H "Content-Type: application/json" \
-d '{
"first_name": "Jane",
"last_name": "Doe",
"is_active": true
}'

Bulk Create Operations​

Create multiple records in a single request:

curl -X POST http://localhost:8080/v1/sqlitedb/actor/_bulk \
-H "Content-Type: application/json" \
-d '[
{
"first_name": "BRAD",
"last_name": "PITT"
},
{
"first_name": "ANGELINA",
"last_name": "JOLIE"
}
]'

Response:

{
"rows": 2,
"keys": [
{"actor_id": 202},
{"actor_id": 203}
]
}

Read Operations (GET)​

Get All Records​

Retrieve all films:

curl -X GET http://localhost:8080/v1/sqlitedb/film \
-H "Accept: application/json"

Response:

[
{
"film_id": 1,
"title": "ACADEMY DINOSAUR",
"description": "A Epic Drama of a Feminist And a Mad Scientist",
"release_year": 2006,
"language_id": 1,
"rental_duration": 6,
"rental_rate": 0.99,
"length": 86,
"replacement_cost": 20.99,
"rating": "PG",
"special_features": "Deleted Scenes,Behind the Scenes",
"last_update": "2023-01-01T10:00:00"
}
]

Get Record by ID​

curl -X GET http://localhost:8080/v1/sqlitedb/film/1 \
-H "Accept: application/json"

Field Selection​

Get specific fields only:

curl -X GET "http://localhost:8080/v1/sqlitedb/film?fields=film_id,title,language_id" \
-H "Accept: application/json"

Response:

[
{
"film_id": 1,
"title": "ACADEMY DINOSAUR",
"language_id": 1
}
]

Pagination​

Get paginated results:

curl -X GET "http://localhost:8080/v1/sqlitedb/film?limit=2&offset=0" \
-H "Accept: application/json"

Sorting​

Sort by title ascending:

curl -X GET "http://localhost:8080/v1/sqlitedb/film?sort=title&fields=film_id,title" \
-H "Accept: application/json"

Sort by multiple fields:

curl -X GET "http://localhost:8080/v1/sqlitedb/film?sort=release_year,-title" \
-H "Accept: application/json"

Filtering with RSQL​

Basic Filters​

Filter by language ID:

curl -X GET "http://localhost:8080/v1/sqlitedb/film?filter=language_id==1" \
-H "Accept: application/json"

Comparison Operators​

# Greater than
curl -X GET "http://localhost:8080/v1/sqlitedb/film?filter=rental_rate>1.0"

# Less than or equal
curl -X GET "http://localhost:8080/v1/sqlitedb/film?filter=length<=90"

# Not equal
curl -X GET "http://localhost:8080/v1/sqlitedb/film?filter=rating!=G"

# Like operator
curl -X GET "http://localhost:8080/v1/sqlitedb/film?filter=title=like='ACADEMY*'"

Logical Operators​

# AND condition
curl -X GET "http://localhost:8080/v1/sqlitedb/film?filter=language_id==1;rental_rate>1.0"

# OR condition
curl -X GET "http://localhost:8080/v1/sqlitedb/film?filter=rating==G,rating==PG"

# Complex conditions
curl -X GET "http://localhost:8080/v1/sqlitedb/film?filter=(language_id==1;rental_rate>1.0),rating==R"

IN Operator​

curl -X GET "http://localhost:8080/v1/sqlitedb/film?filter=rating=in=(G,PG,PG-13)"

Boolean Filtering​

Filter employees by active status:

curl -X GET "http://localhost:8080/v1/sqlitedb/employee?filter=is_active==true" \
-H "Accept: application/json"

Response:

[
{
"emp_id": 1,
"first_name": "Alice",
"last_name": "Smith",
"is_active": 1,
"created_at": "2023-01-01T10:00:00"
}
]

Update Operations (PUT/PATCH)​

Update Single Record​

Update a film by ID:

curl -X PUT http://localhost:8080/v1/sqlitedb/film/1 \
-H "Content-Type: application/json" \
-d '{
"title": "UPDATED TITLE",
"rental_rate": 2.99
}'

Response:

{
"rows": 1
}

Bulk Update​

Update multiple records with filter:

curl -X PUT "http://localhost:8080/v1/sqlitedb/film?filter=language_id==1" \
-H "Content-Type: application/json" \
-d '{
"rental_rate": 3.99
}'

Conditional Update​

Update with specific conditions:

curl -X PUT "http://localhost:8080/v1/sqlitedb/employee?filter=is_active==false" \
-H "Content-Type: application/json" \
-d '{
"is_active": true
}'

Delete Operations (DELETE)​

Delete by ID​

curl -X DELETE http://localhost:8080/v1/sqlitedb/film/1

Response:

{
"rows": 1
}

Delete with Filter​

Delete all inactive employees:

curl -X DELETE "http://localhost:8080/v1/sqlitedb/employee?filter=is_active==false"

Soft Delete​

For tables with soft delete columns:

curl -X DELETE "http://localhost:8080/v1/sqlitedb/film/1?soft=true"

Join Operations​

Inner Join​

Get films with their language information:

curl -X GET "http://localhost:8080/v1/sqlitedb/film?join=language:language_id=language.language_id" \
-H "Accept: application/json"

Cross Join​

curl -X GET "http://localhost:8080/v1/sqlitedb/film?join=actor&joinType=cross&limit=5" \
-H "Accept: application/json"

Join with Filtering​

curl -X GET "http://localhost:8080/v1/sqlitedb/film?join=language:language_id=language.language_id&filter=language.name==English" \
-H "Accept: application/json"

Count Operations​

Basic Count​

Get total number of films:

curl -X GET http://localhost:8080/v1/sqlitedb/film/_count \
-H "Accept: application/json"

Response:

{
"count": 1000
}

Count with Filter​

Count active employees:

curl -X GET "http://localhost:8080/v1/sqlitedb/employee/_count?filter=is_active==true" \
-H "Accept: application/json"

Template Operations​

Execute Custom Queries​

Execute a predefined query template:

curl -X POST http://localhost:8080/v1/sqlitedb/_template/films_by_rating \
-H "Content-Type: application/json" \
-d '{
"rating": "PG"
}'

JSON Data Handling​

Create Record with JSON​

curl -X POST http://localhost:8080/v1/sqlitedb/metadata \
-H "Content-Type: application/json" \
-d '{
"name": "app_config",
"config": {
"theme": "dark",
"notifications": true,
"features": ["feature1", "feature2"]
}
}'

Query JSON Fields​

curl -X GET "http://localhost:8080/v1/sqlitedb/metadata?filter=name==app_config" \
-H "Accept: application/json"

Date/Time Operations​

Create with DateTime​

curl -X POST http://localhost:8080/v1/sqlitedb/film \
-H "Content-Type: application/json" \
-d '{
"title": "TIME MOVIE",
"language_id": 1,
"last_update": "2023-12-01T15:30:00"
}'

Filter by Date Range​

curl -X GET "http://localhost:8080/v1/sqlitedb/film?filter=last_update>=2023-01-01T00:00:00;last_update<=2023-12-31T23:59:59" \
-H "Accept: application/json"

Error Handling​

Invalid Table​

curl -X GET http://localhost:8080/v1/sqlitedb/non_existent_table \
-H "Accept: application/json"

Response:

{
"timestamp": "2023-12-01T10:00:00.000+00:00",
"status": 400,
"error": "Bad Request",
"message": "Table 'non_existent_table' not found",
"path": "/v1/sqlitedb/non_existent_table"
}

Invalid Column​

curl -X POST http://localhost:8080/v1/sqlitedb/film \
-H "Content-Type: application/json" \
-d '{
"title": "TEST",
"invalid_column": "value"
}'

Response:

{
"timestamp": "2023-12-01T10:00:00.000+00:00",
"status": 400,
"error": "Bad Request",
"detail": "Column not found film.invalid_column",
"path": "/v1/sqlitedb/film"
}

Performance Tips​

Use Field Selection​

Instead of retrieving all columns:

# Inefficient
curl -X GET http://localhost:8080/v1/sqlitedb/film

# Efficient
curl -X GET "http://localhost:8080/v1/sqlitedb/film?fields=film_id,title"

Implement Pagination​

For large datasets:

curl -X GET "http://localhost:8080/v1/sqlitedb/film?limit=50&offset=0"

Use Appropriate Filters​

Filter at the database level:

curl -X GET "http://localhost:8080/v1/sqlitedb/film?filter=language_id==1&limit=10"

SQLite-Specific Considerations​

Boolean Values​

SQLite stores booleans as integers (0/1):

  • true → 1
  • false → 0

Auto-increment Keys​

SQLite uses INTEGER PRIMARY KEY AUTOINCREMENT for auto-generated IDs.

Case Sensitivity​

SQLite is case-insensitive for SQL keywords but case-sensitive for identifiers.

Data Type Affinity​

SQLite uses dynamic typing with type affinity:

  • TEXT
  • NUMERIC
  • INTEGER
  • REAL
  • BLOB

Advanced Features​

Custom SQL Templates​

Create custom query templates for complex operations:

-- Template: films_by_actor.sql
SELECT f.film_id, f.title, a.first_name, a.last_name
FROM film f
JOIN film_actor fa ON f.film_id = fa.film_id
JOIN actor a ON fa.actor_id = a.actor_id
WHERE a.actor_id = :actorId

Execute the template:

curl -X POST http://localhost:8080/v1/sqlitedb/_template/films_by_actor \
-H "Content-Type: application/json" \
-d '{"actorId": 1}'

Batch Operations​

For high-performance bulk operations, use batch endpoints:

curl -X POST http://localhost:8080/v1/sqlitedb/actor/_batch \
-H "Content-Type: application/json" \
-d '[
{"first_name": "Actor1", "last_name": "LastName1"},
{"first_name": "Actor2", "last_name": "LastName2"}
]'

This comprehensive guide covers all major SQLite operations available through db2rest. For configuration details, see the SQLite Configuration Guide.