Skip to main content

SQLite-compatible database with CJK FTS5 and vector similarity support

Project description

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 (sql5 on 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

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sql6-6.15.0.tar.gz (35.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sql6-6.15.0-py3-none-any.whl (32.0 kB view details)

Uploaded Python 3

File details

Details for the file sql6-6.15.0.tar.gz.

File metadata

  • Download URL: sql6-6.15.0.tar.gz
  • Upload date:
  • Size: 35.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.15

File hashes

Hashes for sql6-6.15.0.tar.gz
Algorithm Hash digest
SHA256 10efc4239631df5d05a049b3ffe632355b143afda4790b809b1e5081902234e4
MD5 da856a4f7329ae649f3b17dcedc8c8b9
BLAKE2b-256 e606a3a268a0da162e733582ad388122b5c4289f004a253dee00675110f9b2fe

See more details on using hashes here.

File details

Details for the file sql6-6.15.0-py3-none-any.whl.

File metadata

  • Download URL: sql6-6.15.0-py3-none-any.whl
  • Upload date:
  • Size: 32.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.15

File hashes

Hashes for sql6-6.15.0-py3-none-any.whl
Algorithm Hash digest
SHA256 40b13bf8247989c951b35716adc69b39a2ffe1cf145c0341e797a7d31c32fc6c
MD5 5ca0ef42f581f68f0ecd8b28b72871bf
BLAKE2b-256 3e7bec9483b770ac91d1127c7bf0c273703e5de194489a969c16a0c6d5b6cf18

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page