Skip to main content

WaveDB

How to use WaveDB, a simple sqlite3 database server that ships with Wave.

# Before you run this example, start WaveDB (`wavedb`).
# By default, WaveDB listens on port 10100.
#
# To run this example, execute `python db.py`
#
# If your WaveDB instance is configured differently, you might want to set
# the following environment variables accordingly:
# H2O_WAVEDB_ADDRESS - the ip:port of the database server
# H2O_WAVEDB_ACCESS_KEY_ID - the API access key ID
# H2O_WAVEDB_ACCESS_KEY_SECRET - the API access key secret

import asyncio
from h2o_wave import connect


async def main():
# Create a database connection
connection = connect()

# Access the 'employees' database.
# A new database is created automatically if it does not exist.
db = connection["employees"]

# Execute some statements.
await db.exec("drop table if exists employee")
await db.exec("create table employee(empid integer, name text, title text)")

# Execute a statement and handle errors.
results, err = await db.exec("insert into employee values(?, ?, ?)", 101, 'Jeffrey Lebowski', 'Slacker')
if err:
raise ValueError(err)

# Execute many statements.
insert_employee = "insert into employee values(?, ?, ?)"
await db.exec_many(
(insert_employee, 102, 'Walter Sobchak', 'Veteran'),
(insert_employee, 103, 'Donny Kerabatsos', 'Sidekick'),
(insert_employee, 104, 'Jesus Quintana', 'Bowler'),
(insert_employee, 105, 'Uli Kunkel', 'Nihilist'),
)

# Execute many statements as a transaction.
await db.exec_atomic(
(insert_employee, 106, 'Brandt', 'Butler'),
(insert_employee, 107, 'Maude Lebowski', 'Artist'),
(insert_employee, 108, 'Franz', 'Nihilist'),
(insert_employee, 109, 'Kieffer', 'Nihilist'),
)

# Read records.
rows, err = await db.exec("select * from employee")
if err:
raise ValueError(err)

print(rows)

# Prints:
# [
# [101, 'Jeffrey Lebowski', 'Slacker'],
# [102, 'Walter Sobchak', 'Veteran'],
# [103, 'Donny Kerabatsos', 'Sidekick'],
# [104, 'Jesus Quintana', 'Bowler'],
# [105, 'Uli Kunkel', 'Nihilist'],
# [106, 'Brandt', 'Butler'],
# [107, 'Maude Lebowski', 'Artist'],
# [108, 'Franz', 'Nihilist'],
# [109, 'Kieffer', 'Nihilist']
# ]

# Clean up.
await db.exec("drop table employee")

# Drop the database entirely. Warning: A database is irrecoverable once dropped.
await db.drop()

# Close connection.
await connection.close()


loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.run_until_complete(main())