sql5
SQLite-compatible database with native CJK FTS5 support. Built with Rust.
v3.0 - Client-Server Architecture with WebSocket Support
sql5 v3.0 consists of:
- Python package (
sql5on PyPI): Pure Python client - Rust binary: Server process providing all SQL functionality
The Python client communicates with the Rust server via:
- Subprocess mode (default): JSON over stdin/stdout
- WebSocket mode (v3.0): WebSocket protocol for multi-client support
Installation
pip install sql5
Python API
import sql5
# Subprocess mode (default, v2.0 compatible)
db = sql5.connect("mydb.db")
# Or use WebSocket mode (v3.0, multi-client support)
db = sql5.connect(
path="mydb.db",
transport="websocket",
host="127.0.0.1",
port=8080
)
# Execute SQL
db.execute("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)")
db.execute("INSERT INTO users VALUES (1, 'Alice', 30)")
db.execute("INSERT INTO users VALUES (2, 'Bob', 25)")
db.execute("INSERT INTO users VALUES (3, 'Charlie', 35)")
# Query with parameters
db.execute("INSERT INTO users VALUES (?, ?, ?)", (4, "David", 28))
# Fetch results
cursor = db.execute("SELECT * FROM users WHERE age > ?", (25,))
for row in cursor:
print(row)
# (1, 'Alice', 30)
# (2, 'Bob', 25)
# (3, 'Charlie', 35)
# (4, 'David', 28)
# Fetch as list
cursor = db.execute("SELECT name, age FROM users ORDER BY age")
rows = cursor.fetchall()
print(rows)
# [('Bob', 25), ('David', 28), ('Alice', 30), ('Charlie', 35)]
# Fetch one
cursor = db.execute("SELECT * FROM users WHERE id = ?", (1,))
row = cursor.fetchone()
print(row)
# (1, 'Alice', 30)
# Transactions
db.execute("BEGIN")
db.execute("INSERT INTO users VALUES (5, 'Eve', 40)")
db.execute("COMMIT")
# Or rollback
db.execute("BEGIN")
db.execute("INSERT INTO users VALUES (6, 'Frank', 45)")
db.execute("ROLLBACK")
# Full-text search (FTS5)
db.execute("CREATE VIRTUAL TABLE articles USING fts5(title, body)")
db.execute("INSERT INTO articles VALUES ('Hello World', 'The quick brown fox')")
db.execute("INSERT INTO articles VALUES ('Rust Guide', 'Memory safety without GC')")
db.execute("INSERT INTO articles VALUES ('中文測試', '繁體中文全文檢索')")
cursor = db.execute("SELECT * FROM articles WHERE articles MATCH ?", ("rust",))
print(cursor.fetchall())
# [('Rust Guide', 'Memory safety without GC')]
cursor = db.execute("SELECT * FROM articles WHERE articles MATCH ?", ("中文",))
print(cursor.fetchall())
# [('中文測試', '繁體中文全文檢索')]
# Close database
db.close()
Connection Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
path |
str | None | Database file path |
transport |
str | "subprocess" | "subprocess" or "websocket" |
host |
str | "127.0.0.1" | WebSocket server host |
port |
int | 8080 | WebSocket server port |
CLI Usage
# Run the REPL
sql5
# Open a database file
sql5 /path/to/database.db
# Execute single query
echo "SELECT 1 + 1;" | sql5
Features
- Full SQL support (SELECT, INSERT, UPDATE, DELETE, CREATE, DROP)
- ACID transactions (BEGIN, COMMIT, ROLLBACK)
- WAL mode
- Foreign keys
- Views
- Triggers
- Full-text search (FTS5) with CJK bigram tokenization
- Multiple database attachment (ATTACH DATABASE)
- Window functions (ROW_NUMBER, RANK, LAG, LEAD, etc.)
- String functions (UPPER, LOWER, SUBSTR, REPLACE, etc.)
- Date/time functions (DATE, TIME, DATETIME, STRFTIME)
- JSON functions (JSON, JSON_EXTRACT, JSON_SET, etc.)
- WebSocket server mode (v3.0, multi-client support)
- Subprocess server mode (v2.0, backward compatible)
Requirements
- Python 3.8+
- For WebSocket mode:
pip install websocket-client(auto-installed as dependency)
Development
To use a local Rust binary instead of downloading from GitHub:
export SQL5_BINARY=/path/to/local/sql5
python -c "import sql5; print(sql5.__version__)"
License
MIT
Metadata
Release files for sql5 4.0.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| sql5-4.0.2.tar.gz | 22.5 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sql5-4.0.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 39.2 kB
Release files / sql5-4.0.2.tar.gz
| Download URL | sql5-4.0.2.tar.gz |
|---|---|
| Size | 22.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
376e7b6b91f5e2a407580207d0165627a38dae8ef298e45b8f52c99ccca0f564
|
|
BLAKE2b-256 checksum How to use checksums |
eceaa11cbb73f4e57e7d71aa626fd40dd4e59f6089d6bd831815f801cc86a736
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.2
|
Release files / sql5-4.0.2-py3-none-any.whl
| Download URL | sql5-4.0.2-py3-none-any.whl |
|---|---|
| Size | 16.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
225636e0059816775d0f9126a83141c112da4308fae0abf36c38b7baa3a3c0ba
|
|
BLAKE2b-256 checksum How to use checksums |
3b4c3c0b110cb96c99ad5a35f1b043a5297281f8835301fcffde33b88dfd2ba5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.2
|
Security for sql5 4.0.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.