Skip to main content

Turso is a work-in-progress, in-process OLTP database management system, compatible with SQLite.

Project description

Turso Database for Python

PyPI

Chat with other users of Turso on Discord


About

⚠️ Warning: This software is in BETA. It may still contain bugs and unexpected behavior. Use caution with production data and ensure you have backups.

Features

  • SQLite compatible: SQLite query language and file format support (status).
  • In-process: No network overhead, runs directly in your Python process
  • Cross-platform: Supports Linux, macOS, Windows
  • Remote partial sync: Bootstrap from a remote database, pull remote changes, and push local changes when online — all while enjoying a fully operational database offline.
  • Asyncio support: Built-in integration with asyncio to ensure queries won’t block your event loop

Installation

uv pip install pyturso

Database driver

A minimal DB‑API 2.0 example using an in‑memory database:

import turso

# Standard DB-API usage
conn = turso.connect(":memory:")
cur = conn.cursor()

cur.execute("CREATE TABLE users (id INTEGER PRIMARY KEY, username TEXT)")
cur.execute("INSERT INTO users VALUES (1, 'alice'), (2, 'bob')")

cur.execute("SELECT * FROM users ORDER BY id")
rows = cur.fetchall()
print(rows)  # [(1, 'alice'), (2, 'bob')]

conn.close()

Database driver (asyncio)

Non-blocking access with asyncio:

import asyncio
import turso.aio

async def main():
    # Connect and use as an async context manager
    async with turso.aio.connect(":memory:") as conn:
        # Executes multiple statements
        await conn.executescript("""
            CREATE TABLE t (id INTEGER PRIMARY KEY, name TEXT);
            INSERT INTO t(name) VALUES ('alice'), ('bob');
        """)

        # Use a cursor for parameterized queries
        cur = conn.cursor()
        await cur.execute("SELECT COUNT(*) FROM t WHERE name LIKE ?", ("a%",))
        count = (await cur.fetchone())[0]
        print(count)  # 1

        # JSON and generate_series also available
        cur = conn.cursor()
        await cur.execute("SELECT SUM(value) FROM generate_series(1, 10)")
        print((await cur.fetchone())[0])  # 55

asyncio.run(main())

Synchronization driver

Use a remote Turso database while working locally. You can bootstrap local state from the remote, pull remote changes, and push local commits.

Note: You need a Turso remote URL. See the Turso docs for provisioning and authentication.

import turso.sync

# Connect a local database to a remote Turso database
conn = turso.sync.connect(
    ":memory:",                          # local db path (or a file path)
    remote_url="https://<db>.<region>.turso.io"  # your remote URL
)

# Read data (fetched from remote if not present locally yet)
rows = conn.execute("SELECT * FROM t").fetchall()
print(rows)

# Pull new changes from remote into local
changed = conn.pull()
print("Pulled:", changed)  # True if there were new remote changes

# Make local changes
conn.execute("INSERT INTO t VALUES ('push works')")
conn.commit()

# Push local commits to remote
conn.push()

# Optional: inspect and manage sync state
stats = conn.stats()
print("Network received (bytes):", stats.network_received_bytes)
conn.checkpoint()  # compact local WAL after many writes

conn.close()

Partial bootstrap to reduce initial network cost:

import turso.sync

conn = turso.sync.connect(
    "local.db",
    remote_url="https://<db>.<region>.turso.io",
    # fetch first 128 KiB upfront
    partial_sync_experimental=turso.sync.PartialSyncOpts(
      bootstrap_strategy=turso.sync.PartialSyncPrefixBootstrap(length=128 * 1024),
    ),
)

Synchronization driver (asyncio)

The same sync primitives, but fully async:

import asyncio

async def main():
    conn = await turso.aio.sync.connect(":memory:", remote_url="https://<db>.<region>.turso.io")

    # Read data
    rows = await (await conn.execute("SELECT * FROM t")).fetchall()
    print(rows)

    # Pull and push
    await conn.pull()
    await conn.execute("INSERT INTO t VALUES ('hello from asyncio')")
    await conn.commit()
    await conn.push()

    # Stats and maintenance
    stats = await conn.stats()
    print("Main WAL size:", stats.main_wal_size)
    await conn.checkpoint()

    await conn.close()

asyncio.run(main())

License

This project is licensed under the MIT license.

Support

Project details


Release history Release notifications | RSS feed

Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

pyturso-0.6.0rc13-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (15.6 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

pyturso-0.6.0rc13-cp311-cp311-macosx_11_0_arm64.whl (4.8 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

pyturso-0.6.0rc13-cp311-cp311-macosx_10_12_x86_64.whl (5.3 MB view details)

Uploaded CPython 3.11macOS 10.12+ x86-64

pyturso-0.6.0rc13-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (16.1 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

pyturso-0.6.0rc13-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (15.6 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

pyturso-0.6.0rc13-cp310-cp310-macosx_11_0_arm64.whl (4.8 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

pyturso-0.6.0rc13-cp310-cp310-macosx_10_12_x86_64.whl (5.3 MB view details)

Uploaded CPython 3.10macOS 10.12+ x86-64

File details

Details for the file pyturso-0.6.0rc13-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for pyturso-0.6.0rc13-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 1305e8d663edc51af8529ec7493f56d5207d4123fb78036ae2133ca7f61bea8c
MD5 46e04fa8d16edf0b7527578e7335cebf
BLAKE2b-256 8de2ca335a73beeb9aa62e6734780f267a2a62a98b5034c18ea7029af13f660f

See more details on using hashes here.

File details

Details for the file pyturso-0.6.0rc13-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pyturso-0.6.0rc13-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0fffb87f1119a2e2375c69e63372264c7d7f8fd8a6d8a569723b7a4bbe6bbdc9
MD5 8faf75bad5182b1f4960ce4ab3aa9543
BLAKE2b-256 b4ddb7a3e8d231b0b9a97b480d630a1b14b445493536a49f854dd31f33eebb3e

See more details on using hashes here.

File details

Details for the file pyturso-0.6.0rc13-cp311-cp311-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for pyturso-0.6.0rc13-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 77f86f8efd89599bfac9dde7666ebebf864908cd6a2fff0d66b5147e2d3e14e8
MD5 34a1decaa7b0618ede0a2a4f2c446fb3
BLAKE2b-256 2261bf4bb6042592339a23b98f3fd9a924d88946252e5e24835d64fec8b0bde7

See more details on using hashes here.

File details

Details for the file pyturso-0.6.0rc13-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pyturso-0.6.0rc13-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 88d7c079594c56e2561e639a9333a981ec4b4431d1a33916f5281e5911af809a
MD5 e1dc43a885203ca48e00356420c43f4e
BLAKE2b-256 02dd9fa8ca90d1915dcf9a0fe70e690b28ded132f05ed44424614ad6c1a8c41c

See more details on using hashes here.

File details

Details for the file pyturso-0.6.0rc13-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for pyturso-0.6.0rc13-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 0a754d2c5199cc3cd03765e80e58d4d65fa3360f86e70eaa29151e2573f7d2a3
MD5 01f395dae375a5a641d0de0f9093ee22
BLAKE2b-256 d876f05f8c94efdc2ffb20a0954c6955d255ebbd493d1a2685b8d9d377c73dda

See more details on using hashes here.

File details

Details for the file pyturso-0.6.0rc13-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pyturso-0.6.0rc13-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d93e55661a24988a44dd7d68886079bc35cefd669a36c40f655ac15f59d9fb73
MD5 dbb00c3e414adec84aebb24035b833b3
BLAKE2b-256 d7f837edd72f03aabe5d3b64a9e28987cb55955c7aaa57bda33980dbd6d0faf9

See more details on using hashes here.

File details

Details for the file pyturso-0.6.0rc13-cp310-cp310-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for pyturso-0.6.0rc13-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 db8a400d8c4029584dc19758b8f78d561cf6272c961d4a6fb2e10a8b43360a24
MD5 e50fb0403b25b0e0544a1fd92614375e
BLAKE2b-256 b2c9e514b1c79e4ff0c04a94470cf5c635862284d73ccf5e47315631f3170093

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