Embedded Replicas

You can work with embedded replicas that can sync from the remote database to a local SQLite file, and delegate writes to the remote primary database:

import os

import libsql_experimental as libsql

conn = libsql.connect("local.db", sync_url=os.getenv("LIBSQL_URL"),
                      auth_token=os.getenv("LIBSQL_AUTH_TOKEN"))
conn.execute("CREATE TABLE IF NOT EXISTS users (id INTEGER);")
conn.execute("INSERT INTO users(id) VALUES (1);")
conn.commit()

print(conn.execute("select * from users").fetchall())

Embedded Replicas only works where you have access to the file system.

Periodic Sync

You can automatically sync at intervals by passing time in seconds to the sync_interval option. For example, to sync every minute, you can use the following code:

conn = libsql.connect("local.db", sync_interval=60, sync_url=os.getenv("LIBSQL_URL"),
                      auth_token=os.getenv("LIBSQL_AUTH_TOKEN"))

Manual Sync

The Sync function allows you to sync manually the local database with the remote counterpart:

conn.execute("INSERT INTO users(id) VALUES (2);")
conn.commit()
conn.sync()

Encryption

To enable encryption on a SQLite file, pass the encryption secret to the encryption_key option:

conn = libsql.connect("encrypted.db", sync_url=os.getenv("LIBSQL_URL"),
                      auth_token=os.getenv("LIBSQL_AUTH_TOKEN"),
                      encryption_key=os.getenv("ENCRYPTION_KEY"))

Encrypted databases appear as raw data and cannot be read as standard SQLite databases. You must use the libSQL client for any operations — learn more.