A experimental REST API for managing multiple SQLite databases with extension support, caching, query optimization, and SQL dialect conversion.
- Multi-Database Support: Create and manage multiple SQLite databases
- SQLite Extension Management: Load and use SQLite extensions
- Query Cache: LRU caching with configurable TTL for query results
- Asynchronous Execution: Non-blocking query execution with background processing
- Query Optimization: SQL query optimization using SQLGlot
- SQL Dialect Conversion: Convert between different SQL dialects
- Authentication: API key-based security
- Python 3.8+
- pip
- Clone the repository:
git clone https://github.com/joaojkuligowski/sqlite-multi-db-api.git
cd sqlite-multi-db-api
- Create a virtual environment:
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
- Install dependencies:
pip install -r requirements.txt
- Create an
.env
file based on.env.example
:
cp .env.example .env
- Edit the
.env
file to set your API key and other configuration options.
python src/main.py
This will start the server on http://localhost:8000.
POST /query
- Execute a SQL queryGET /query/{query_id}
- Get status and results of a query
POST /db/{db_name}
- Create a new database
GET /extensions
- List available extensionsPOST /extensions/load
- Load an extension into a databaseGET /extensions/{extension_name}
- Get information about an extensionGET /db/{db_name}/extensions
- List extensions loaded in a database
POST /tools/optimize
- Optimize a SQL queryPOST /tools/convert
- Convert a query between SQL dialects
curl -X POST "http://localhost:8000/query" \
-H "X-API-Key: your-secret-api-key" \
-H "Content-Type: application/json" \
-d '{
"query": "SELECT * FROM example LIMIT 10",
"db_name": "default",
"cache_ttl": 300
}'
curl -X POST "http://localhost:8000/db/my_new_db" \
-H "X-API-Key: your-secret-api-key"
curl -X POST "http://localhost:8000/extensions/load" \
-H "X-API-Key: your-secret-api-key" \
-H "Content-Type: application/json" \
-d '{
"extension_name": "my_extension.so",
"db_name": "default"
}'
curl -X POST "http://localhost:8000/tools/optimize" \
-H "X-API-Key: your-secret-api-key" \
-H "Content-Type: application/json" \
-d '{
"query": "SELECT a.id, b.name FROM table_a a LEFT JOIN table_b b ON a.id = b.id WHERE a.value > 10"
}'
curl -X POST "http://localhost:8000/tools/convert" \
-H "X-API-Key: your-secret-api-key" \
-H "Content-Type: application/json" \
-d '{
"origin_dialect": "sqlite",
"target_dialect": "mysql",
"query": "SELECT * FROM users WHERE rowid = 1"
}'
Edit the configuration in src/config.py
or override using environment variables:
API_KEY
: Authentication key for API accessDB_DIR
: Directory to store SQLite databasesEXTENSIONS_DIR
: Directory for SQLite extensionsMAX_WORKERS
: Maximum number of worker threadsCACHE_EXPIRY
: Default cache expiration time in secondsMAX_CACHE_SIZE
: Maximum number of items in the query cache
To use SQLite extensions:
- Place your
.so
(Linux),.dll
(Windows), or.dylib
(macOS) extension files in theextensions/
directory - Load extensions using the API endpoints
pytest tests/
- Create new models in the
src/models/
directory - Implement service logic in the
src/services/
directory - Add new endpoints in the
src/api/routes/
directory - Register the endpoints in
src/api/router.py
MIT