Skip to main content

query(sql, options?)

Execute a SQL query against the oleander lake using DuckDB. Returns structured results with columns, types, and rows.
result = await client.query(
    "SELECT * FROM public.iris_dataset LIMIT 10"
)

columns = result.results.columns       # ["sepal_length", "sepal_width", ...]
rows = result.results.rows             # [[5.1, 3.5, ...], ...]
count = result.row_count               # 10
elapsed = result.execution_time        # "42ms"

Parameters

sql
str
required
The SQL query to execute. Supports all DuckDB SQL syntax.
options
QueryOptions
Optional query options. Pass a QueryOptions instance to configure behavior.
options.save
bool
default:"False"
When True, persists query results as a table. The table name is returned in saved_table_name.

Saving results

Use QueryOptions(save=True) to persist query results as a table for later use.
from oleander_sdk import QueryOptions

result = await client.query(
    "SELECT * FROM public.iris_dataset LIMIT 10",
    QueryOptions(save=True)
)

if result.saved_table_name:
    # Run a follow-up query against the saved table
    follow_up = await client.query(
        f"SELECT avg(sepal_length) FROM {result.saved_table_name}"
    )

Iterating over results

result = await client.query("SELECT name, score FROM public.rankings")

columns = result.results.columns
rows = result.results.rows
name_idx = columns.index("name")
score_idx = columns.index("score")

for row in rows:
    name = row[name_idx]
    score = row[score_idx]
    # process each record ...

Return type: LakeQueryResult

FieldTypeDescription
successboolWhether the query executed successfully
resultsQueryResultColumnsQuery results with columns, column_types, and rows
row_countOptional[int]Number of rows returned
execution_timeOptional[str]Query execution time (e.g., "42ms")
saved_table_nameOptional[str]Table name if save=True was used
queryOptional[str]The original SQL query
errorOptional[str]Error message if the query failed
detailsOptional[str]Additional error details