# Laketower
> Oversee your lakehouse
[](https://pypi.org/project/laketower/)
[](https://pypi.org/project/laketower/)
[](https://github.com/datalpia/laketower/actions/workflows/ci-cd.yml)
[](https://github.com/datalpia/laketower/blob/main/LICENSE.md)
Utility application to explore and manage tables in your data lakehouse, especially tailored for data pipelines local development.
## Features
- Delta Lake table format support
- Inspect table metadata
- Inspect table schema
- Inspect table history
- View table content with a simple query builder
- Query all registered tables with DuckDB SQL dialect
- Static and versionable YAML configuration
- Web application
- CLI application
## Installation
Using `pip` (or any other Python package manager):
```bash
pip install laketower
```
Using `uvx`:
```bash
uvx laketower
```
## Usage
### Configuration
Laketower configuration is based on a static YAML configuration file allowing to:
- List all tables to be registered
Format:
```yaml
tables:
- name: <table_name>
uri: <local path to table>
format: {delta}
```
Current limitations:
- `tables.uri`: only local paths are allowed
- `tables.format`: only `delta` is allowed
Example from the provided demo:
```yaml
tables:
- name: sample_table
uri: demo/sample_table
format: delta
- name: weather
uri: demo/weather
format: delta
```
### Web Application
The easiest way to get started is to launch the Laketower web application:
```bash
$ laketower -c demo/laketower.yml web
```
### CLI
Laketower provides a CLI interface:
```bash
$ laketower --help
usage: laketower [-h] [--version] [--config CONFIG] {web,config,tables} ...
options:
-h, --help show this help message and exit
--version show program's version number and exit
--config, -c CONFIG Path to the Laketower YAML configuration file (default: laketower.yml)
commands:
{web,config,tables}
web Launch the web application
config Work with configuration
tables Work with tables
```
By default, a YAML configuration file named `laketower.yml` will be looked for.
A custom path can be specified with the `-c` / `--config` argument.
#### Validate YAML configuration
```bash
$ laketower -c demo/laketower.yml config validate
╭────────────────────────╮
│ Configuration is valid │
╰────────────────────────╯
Config(
tables=[
ConfigTable(name='sample_table', uri='demo/sample_table', table_format=<TableFormats.delta: 'delta'>),
ConfigTable(name='weather', uri='demo/weather', table_format=<TableFormats.delta: 'delta'>)
]
)
```
#### List all registered tables
```bash
$ laketower -c demo/laketower.yml tables list
tables
├── sample_table
│ ├── format: delta
│ └── uri: demo/sample_table
└── weather
├── format: delta
└── uri: demo/weather
```
#### Display a given table metadata
```bash
$ laketower -c demo/laketower.yml tables metadata sample_table
sample_table
├── name: Demo table
├── description: A sample demo Delta table
├── format: delta
├── uri: /Users/romain/Documents/dev/datalpia/laketower/demo/sample_table/
├── id: c1cb1cf0-1f3f-47b5-a660-3cc800edd341
├── version: 3
├── created at: 2025-02-05 22:27:39.579000+00:00
├── partitions:
└── configuration: {}
```
#### Display a given table schema
```bash
$ laketower -c demo/laketower.yml tables schema weather
weather
├── time: timestamp[us, tz=UTC]
├── city: string
├── temperature_2m: float
├── relative_humidity_2m: float
└── wind_speed_10m: float
```
#### Display a given table history
```bash
$ uv run laketower -c demo/laketower.yml tables history weather
weather
├── version: 2
│ ├── timestamp: 2025-02-05 22:27:46.425000+00:00
│ ├── client version: delta-rs.0.23.1
│ ├── operation: WRITE
│ ├── operation parameters
│ │ └── mode: Append
│ └── operation metrics
│ ├── execution_time_ms: 4
│ ├── num_added_files: 1
│ ├── num_added_rows: 168
│ ├── num_partitions: 0
│ └── num_removed_files: 0
├── version: 1
│ ├── timestamp: 2025-02-05 22:27:45.666000+00:00
│ ├── client version: delta-rs.0.23.1
│ ├── operation: WRITE
│ ├── operation parameters
│ │ └── mode: Append
│ └── operation metrics
│ ├── execution_time_ms: 4
│ ├── num_added_files: 1
│ ├── num_added_rows: 408
│ ├── num_partitions: 0
│ └── num_removed_files: 0
└── version: 0
├── timestamp: 2025-02-05 22:27:39.722000+00:00
├── client version: delta-rs.0.23.1
├── operation: CREATE TABLE
├── operation parameters
│ ├── metadata: {"configuration":{},"createdTime":1738794459722,"description":"Historical and forecast weather data from
│ │ open-meteo.com","format":{"options":{},"provider":"parquet"},"id":"a9615fb1-25cc-4546-a0fe-1cb534c514b2","name":"Weather","partitionCol
│ │ umns":[],"schemaString":"{\"type\":\"struct\",\"fields\":[{\"name\":\"time\",\"type\":\"timestamp\",\"nullable\":true,\"metadata\":{}},
│ │ {\"name\":\"city\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}},{\"name\":\"temperature_2m\",\"type\":\"float\",\"nullable\":
│ │ true,\"metadata\":{}},{\"name\":\"relative_humidity_2m\",\"type\":\"float\",\"nullable\":true,\"metadata\":{}},{\"name\":\"wind_speed_1
│ │ 0m\",\"type\":\"float\",\"nullable\":true,\"metadata\":{}}]}"}
│ ├── protocol: {"minReaderVersion":1,"minWriterVersion":2}
│ ├── mode: ErrorIfExists
│ └── location: file:///Users/romain/Documents/dev/datalpia/laketower/demo/weather
└── operation metrics
```
#### View a given table
Using a simple query builder, the content of a table can be displayed.
Optional arguments:
- `--cols <col1> <col2>`: select which columns to display
- `--sort-asc <col>`: sort by a column name in ascending order
- `--sort-desc <col>`: sort by a column name in descending order
- `--limit <num>` (default 10): limit the number of rows
- `--version`: time-travel to table revision number
```bash
$ laketower -c demo/laketower.yml tables view weather
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┓
┃ time ┃ city ┃ temperature_2m ┃ relative_humidity_2m ┃ wind_speed_10m ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━┩
│ 2025-02-05 01:00:00+01:00 │ Grenoble │ 2.0 │ 84.0 │ 4.0 │
│ 2025-02-05 02:00:00+01:00 │ Grenoble │ 2.0999999046325684 │ 83.0 │ 1.5 │
│ 2025-02-05 03:00:00+01:00 │ Grenoble │ 1.600000023841858 │ 86.0 │ 1.100000023841858 │
│ 2025-02-05 04:00:00+01:00 │ Grenoble │ 1.899999976158142 │ 80.0 │ 4.199999809265137 │
│ 2025-02-05 05:00:00+01:00 │ Grenoble │ 1.899999976158142 │ 81.0 │ 3.299999952316284 │
│ 2025-02-05 06:00:00+01:00 │ Grenoble │ 1.399999976158142 │ 88.0 │ 4.300000190734863 │
│ 2025-02-05 07:00:00+01:00 │ Grenoble │ 1.7000000476837158 │ 87.0 │ 5.5 │
│ 2025-02-05 08:00:00+01:00 │ Grenoble │ 1.5 │ 82.0 │ 4.699999809265137 │
│ 2025-02-05 09:00:00+01:00 │ Grenoble │ 1.899999976158142 │ 80.0 │ 2.200000047683716 │
│ 2025-02-05 10:00:00+01:00 │ Grenoble │ 2.9000000953674316 │ 80.0 │ 0.800000011920929 │
└───────────────────────────┴──────────┴────────────────────┴──────────────────────┴───────────────────┘
```
```bash
$ laketower -c demo/laketower.yml tables view weather --cols time city temperature_2m --limit 5 --sort-desc time
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┓
┃ time ┃ city ┃ temperature_2m ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━┩
│ 2025-02-12 00:00:00+01:00 │ Grenoble │ 5.099999904632568 │
│ 2025-02-12 00:00:00+01:00 │ Grenoble │ 5.099999904632568 │
│ 2025-02-11 23:00:00+01:00 │ Grenoble │ 4.900000095367432 │
│ 2025-02-11 23:00:00+01:00 │ Grenoble │ 4.900000095367432 │
│ 2025-02-11 22:00:00+01:00 │ Grenoble │ 4.900000095367432 │
└───────────────────────────┴──────────┴───────────────────┘
```
```bash
$ laketower -c demo/laketower.yml tables view weather --version 1
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┓
┃ time ┃ city ┃ temperature_2m ┃ relative_humidity_2m ┃ wind_speed_10m ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━┩
│ 2025-01-26 01:00:00+01:00 │ Grenoble │ 7.0 │ 87.0 │ 8.899999618530273 │
│ 2025-01-26 02:00:00+01:00 │ Grenoble │ 6.099999904632568 │ 87.0 │ 6.199999809265137 │
│ 2025-01-26 03:00:00+01:00 │ Grenoble │ 6.0 │ 86.0 │ 2.700000047683716 │
│ 2025-01-26 04:00:00+01:00 │ Grenoble │ 6.099999904632568 │ 82.0 │ 3.0999999046325684 │
│ 2025-01-26 05:00:00+01:00 │ Grenoble │ 5.5 │ 87.0 │ 3.299999952316284 │
│ 2025-01-26 06:00:00+01:00 │ Grenoble │ 5.199999809265137 │ 91.0 │ 2.200000047683716 │
│ 2025-01-26 07:00:00+01:00 │ Grenoble │ 4.800000190734863 │ 86.0 │ 3.0 │
│ 2025-01-26 08:00:00+01:00 │ Grenoble │ 4.900000095367432 │ 83.0 │ 1.100000023841858 │
│ 2025-01-26 09:00:00+01:00 │ Grenoble │ 4.0 │ 92.0 │ 3.0999999046325684 │
│ 2025-01-26 10:00:00+01:00 │ Grenoble │ 5.0 │ 86.0 │ 6.400000095367432 │
└───────────────────────────┴──────────┴───────────────────┴──────────────────────┴────────────────────┘
```
#### Query all registered tables
Query any registered tables using DuckDB SQL dialect!
```bash
$ laketower -c demo/laketower.yml tables query "select date_trunc('day', time) as day, avg(temperature_2m) as mean_temperature from weather group by day order by day desc limit 3"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┓
┃ day ┃ mean_temperature ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━┩
│ 2025-02-12 00:00:00+01:00 │ 5.099999904632568 │
│ 2025-02-11 00:00:00+01:00 │ 4.833333373069763 │
│ 2025-02-10 00:00:00+01:00 │ 2.1083333243926368 │
└───────────────────────────┴────────────────────┘
```
## License
Licensed under [GNU Affero General Public License v3.0 (AGPLv3)](LICENSE.md)
Copyright (c) 2025 - present Romain Clement
Raw data
{
"_id": null,
"home_page": null,
"name": "laketower",
"maintainer": null,
"docs_url": null,
"requires_python": "<3.14,>=3.9",
"maintainer_email": null,
"keywords": "data, delta-lake, lakehouse, sql",
"author": null,
"author_email": "Romain Clement <git@romain-clement.net>",
"download_url": "https://files.pythonhosted.org/packages/16/40/12f6748a092657ced8536f3823bd065299ab92963c6561f1c4f7413d2f2b/laketower-0.2.0.tar.gz",
"platform": null,
"description": "# Laketower\n\n> Oversee your lakehouse\n\n[](https://pypi.org/project/laketower/)\n[](https://pypi.org/project/laketower/)\n[](https://github.com/datalpia/laketower/actions/workflows/ci-cd.yml)\n[](https://github.com/datalpia/laketower/blob/main/LICENSE.md)\n\nUtility application to explore and manage tables in your data lakehouse, especially tailored for data pipelines local development.\n\n## Features\n\n- Delta Lake table format support\n- Inspect table metadata\n- Inspect table schema\n- Inspect table history\n- View table content with a simple query builder\n- Query all registered tables with DuckDB SQL dialect\n- Static and versionable YAML configuration\n- Web application\n- CLI application\n\n## Installation\n\nUsing `pip` (or any other Python package manager):\n\n```bash\npip install laketower\n```\n\nUsing `uvx`:\n\n```bash\nuvx laketower\n```\n\n## Usage\n\n### Configuration\n\nLaketower configuration is based on a static YAML configuration file allowing to:\n\n- List all tables to be registered\n\nFormat:\n\n```yaml\ntables:\n - name: <table_name>\n uri: <local path to table>\n format: {delta}\n```\n\nCurrent limitations:\n\n- `tables.uri`: only local paths are allowed\n- `tables.format`: only `delta` is allowed\n\nExample from the provided demo:\n\n```yaml\ntables:\n - name: sample_table\n uri: demo/sample_table\n format: delta\n - name: weather\n uri: demo/weather\n format: delta\n```\n\n### Web Application\n\nThe easiest way to get started is to launch the Laketower web application:\n\n```bash\n$ laketower -c demo/laketower.yml web\n```\n\n### CLI\n\nLaketower provides a CLI interface:\n\n```bash\n$ laketower --help\nusage: laketower [-h] [--version] [--config CONFIG] {web,config,tables} ...\n\noptions:\n -h, --help show this help message and exit\n --version show program's version number and exit\n --config, -c CONFIG Path to the Laketower YAML configuration file (default: laketower.yml)\n\ncommands:\n {web,config,tables}\n web Launch the web application\n config Work with configuration\n tables Work with tables\n```\n\nBy default, a YAML configuration file named `laketower.yml` will be looked for.\nA custom path can be specified with the `-c` / `--config` argument.\n\n#### Validate YAML configuration\n\n```bash\n$ laketower -c demo/laketower.yml config validate\n\n\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 Configuration is valid \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\nConfig(\n tables=[\n ConfigTable(name='sample_table', uri='demo/sample_table', table_format=<TableFormats.delta: 'delta'>),\n ConfigTable(name='weather', uri='demo/weather', table_format=<TableFormats.delta: 'delta'>)\n ]\n)\n```\n\n#### List all registered tables\n\n```bash\n$ laketower -c demo/laketower.yml tables list\n\ntables\n\u251c\u2500\u2500 sample_table\n\u2502 \u251c\u2500\u2500 format: delta\n\u2502 \u2514\u2500\u2500 uri: demo/sample_table\n\u2514\u2500\u2500 weather\n \u251c\u2500\u2500 format: delta\n \u2514\u2500\u2500 uri: demo/weather\n```\n\n#### Display a given table metadata\n\n```bash\n$ laketower -c demo/laketower.yml tables metadata sample_table\n\nsample_table\n\u251c\u2500\u2500 name: Demo table\n\u251c\u2500\u2500 description: A sample demo Delta table\n\u251c\u2500\u2500 format: delta\n\u251c\u2500\u2500 uri: /Users/romain/Documents/dev/datalpia/laketower/demo/sample_table/\n\u251c\u2500\u2500 id: c1cb1cf0-1f3f-47b5-a660-3cc800edd341\n\u251c\u2500\u2500 version: 3\n\u251c\u2500\u2500 created at: 2025-02-05 22:27:39.579000+00:00\n\u251c\u2500\u2500 partitions:\n\u2514\u2500\u2500 configuration: {}\n```\n\n#### Display a given table schema\n\n```bash\n$ laketower -c demo/laketower.yml tables schema weather\n\nweather\n\u251c\u2500\u2500 time: timestamp[us, tz=UTC]\n\u251c\u2500\u2500 city: string\n\u251c\u2500\u2500 temperature_2m: float\n\u251c\u2500\u2500 relative_humidity_2m: float\n\u2514\u2500\u2500 wind_speed_10m: float\n```\n\n#### Display a given table history\n\n```bash\n$ uv run laketower -c demo/laketower.yml tables history weather\n\nweather\n\u251c\u2500\u2500 version: 2\n\u2502 \u251c\u2500\u2500 timestamp: 2025-02-05 22:27:46.425000+00:00\n\u2502 \u251c\u2500\u2500 client version: delta-rs.0.23.1\n\u2502 \u251c\u2500\u2500 operation: WRITE\n\u2502 \u251c\u2500\u2500 operation parameters\n\u2502 \u2502 \u2514\u2500\u2500 mode: Append\n\u2502 \u2514\u2500\u2500 operation metrics\n\u2502 \u251c\u2500\u2500 execution_time_ms: 4\n\u2502 \u251c\u2500\u2500 num_added_files: 1\n\u2502 \u251c\u2500\u2500 num_added_rows: 168\n\u2502 \u251c\u2500\u2500 num_partitions: 0\n\u2502 \u2514\u2500\u2500 num_removed_files: 0\n\u251c\u2500\u2500 version: 1\n\u2502 \u251c\u2500\u2500 timestamp: 2025-02-05 22:27:45.666000+00:00\n\u2502 \u251c\u2500\u2500 client version: delta-rs.0.23.1\n\u2502 \u251c\u2500\u2500 operation: WRITE\n\u2502 \u251c\u2500\u2500 operation parameters\n\u2502 \u2502 \u2514\u2500\u2500 mode: Append\n\u2502 \u2514\u2500\u2500 operation metrics\n\u2502 \u251c\u2500\u2500 execution_time_ms: 4\n\u2502 \u251c\u2500\u2500 num_added_files: 1\n\u2502 \u251c\u2500\u2500 num_added_rows: 408\n\u2502 \u251c\u2500\u2500 num_partitions: 0\n\u2502 \u2514\u2500\u2500 num_removed_files: 0\n\u2514\u2500\u2500 version: 0\n \u251c\u2500\u2500 timestamp: 2025-02-05 22:27:39.722000+00:00\n \u251c\u2500\u2500 client version: delta-rs.0.23.1\n \u251c\u2500\u2500 operation: CREATE TABLE\n \u251c\u2500\u2500 operation parameters\n \u2502 \u251c\u2500\u2500 metadata: {\"configuration\":{},\"createdTime\":1738794459722,\"description\":\"Historical and forecast weather data from\n \u2502 \u2502 open-meteo.com\",\"format\":{\"options\":{},\"provider\":\"parquet\"},\"id\":\"a9615fb1-25cc-4546-a0fe-1cb534c514b2\",\"name\":\"Weather\",\"partitionCol\n \u2502 \u2502 umns\":[],\"schemaString\":\"{\\\"type\\\":\\\"struct\\\",\\\"fields\\\":[{\\\"name\\\":\\\"time\\\",\\\"type\\\":\\\"timestamp\\\",\\\"nullable\\\":true,\\\"metadata\\\":{}},\n \u2502 \u2502 {\\\"name\\\":\\\"city\\\",\\\"type\\\":\\\"string\\\",\\\"nullable\\\":true,\\\"metadata\\\":{}},{\\\"name\\\":\\\"temperature_2m\\\",\\\"type\\\":\\\"float\\\",\\\"nullable\\\":\n \u2502 \u2502 true,\\\"metadata\\\":{}},{\\\"name\\\":\\\"relative_humidity_2m\\\",\\\"type\\\":\\\"float\\\",\\\"nullable\\\":true,\\\"metadata\\\":{}},{\\\"name\\\":\\\"wind_speed_1\n \u2502 \u2502 0m\\\",\\\"type\\\":\\\"float\\\",\\\"nullable\\\":true,\\\"metadata\\\":{}}]}\"}\n \u2502 \u251c\u2500\u2500 protocol: {\"minReaderVersion\":1,\"minWriterVersion\":2}\n \u2502 \u251c\u2500\u2500 mode: ErrorIfExists\n \u2502 \u2514\u2500\u2500 location: file:///Users/romain/Documents/dev/datalpia/laketower/demo/weather\n \u2514\u2500\u2500 operation metrics\n```\n\n#### View a given table\n\nUsing a simple query builder, the content of a table can be displayed.\nOptional arguments:\n\n- `--cols <col1> <col2>`: select which columns to display\n- `--sort-asc <col>`: sort by a column name in ascending order\n- `--sort-desc <col>`: sort by a column name in descending order\n- `--limit <num>` (default 10): limit the number of rows\n- `--version`: time-travel to table revision number\n\n```bash\n$ laketower -c demo/laketower.yml tables view weather\n\n\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n\u2503 time \u2503 city \u2503 temperature_2m \u2503 relative_humidity_2m \u2503 wind_speed_10m \u2503\n\u2521\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2547\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2547\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2547\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2547\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2529\n\u2502 2025-02-05 01:00:00+01:00 \u2502 Grenoble \u2502 2.0 \u2502 84.0 \u2502 4.0 \u2502\n\u2502 2025-02-05 02:00:00+01:00 \u2502 Grenoble \u2502 2.0999999046325684 \u2502 83.0 \u2502 1.5 \u2502\n\u2502 2025-02-05 03:00:00+01:00 \u2502 Grenoble \u2502 1.600000023841858 \u2502 86.0 \u2502 1.100000023841858 \u2502\n\u2502 2025-02-05 04:00:00+01:00 \u2502 Grenoble \u2502 1.899999976158142 \u2502 80.0 \u2502 4.199999809265137 \u2502\n\u2502 2025-02-05 05:00:00+01:00 \u2502 Grenoble \u2502 1.899999976158142 \u2502 81.0 \u2502 3.299999952316284 \u2502\n\u2502 2025-02-05 06:00:00+01:00 \u2502 Grenoble \u2502 1.399999976158142 \u2502 88.0 \u2502 4.300000190734863 \u2502\n\u2502 2025-02-05 07:00:00+01:00 \u2502 Grenoble \u2502 1.7000000476837158 \u2502 87.0 \u2502 5.5 \u2502\n\u2502 2025-02-05 08:00:00+01:00 \u2502 Grenoble \u2502 1.5 \u2502 82.0 \u2502 4.699999809265137 \u2502\n\u2502 2025-02-05 09:00:00+01:00 \u2502 Grenoble \u2502 1.899999976158142 \u2502 80.0 \u2502 2.200000047683716 \u2502\n\u2502 2025-02-05 10:00:00+01:00 \u2502 Grenoble \u2502 2.9000000953674316 \u2502 80.0 \u2502 0.800000011920929 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n```\n\n```bash\n$ laketower -c demo/laketower.yml tables view weather --cols time city temperature_2m --limit 5 --sort-desc time\n\n\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n\u2503 time \u2503 city \u2503 temperature_2m \u2503\n\u2521\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2547\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2547\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2529\n\u2502 2025-02-12 00:00:00+01:00 \u2502 Grenoble \u2502 5.099999904632568 \u2502\n\u2502 2025-02-12 00:00:00+01:00 \u2502 Grenoble \u2502 5.099999904632568 \u2502\n\u2502 2025-02-11 23:00:00+01:00 \u2502 Grenoble \u2502 4.900000095367432 \u2502\n\u2502 2025-02-11 23:00:00+01:00 \u2502 Grenoble \u2502 4.900000095367432 \u2502\n\u2502 2025-02-11 22:00:00+01:00 \u2502 Grenoble \u2502 4.900000095367432 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n```\n\n```bash\n$ laketower -c demo/laketower.yml tables view weather --version 1\n\n\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n\u2503 time \u2503 city \u2503 temperature_2m \u2503 relative_humidity_2m \u2503 wind_speed_10m \u2503\n\u2521\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2547\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2547\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2547\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2547\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2529\n\u2502 2025-01-26 01:00:00+01:00 \u2502 Grenoble \u2502 7.0 \u2502 87.0 \u2502 8.899999618530273 \u2502\n\u2502 2025-01-26 02:00:00+01:00 \u2502 Grenoble \u2502 6.099999904632568 \u2502 87.0 \u2502 6.199999809265137 \u2502\n\u2502 2025-01-26 03:00:00+01:00 \u2502 Grenoble \u2502 6.0 \u2502 86.0 \u2502 2.700000047683716 \u2502\n\u2502 2025-01-26 04:00:00+01:00 \u2502 Grenoble \u2502 6.099999904632568 \u2502 82.0 \u2502 3.0999999046325684 \u2502\n\u2502 2025-01-26 05:00:00+01:00 \u2502 Grenoble \u2502 5.5 \u2502 87.0 \u2502 3.299999952316284 \u2502\n\u2502 2025-01-26 06:00:00+01:00 \u2502 Grenoble \u2502 5.199999809265137 \u2502 91.0 \u2502 2.200000047683716 \u2502\n\u2502 2025-01-26 07:00:00+01:00 \u2502 Grenoble \u2502 4.800000190734863 \u2502 86.0 \u2502 3.0 \u2502\n\u2502 2025-01-26 08:00:00+01:00 \u2502 Grenoble \u2502 4.900000095367432 \u2502 83.0 \u2502 1.100000023841858 \u2502\n\u2502 2025-01-26 09:00:00+01:00 \u2502 Grenoble \u2502 4.0 \u2502 92.0 \u2502 3.0999999046325684 \u2502\n\u2502 2025-01-26 10:00:00+01:00 \u2502 Grenoble \u2502 5.0 \u2502 86.0 \u2502 6.400000095367432 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n```\n\n\n#### Query all registered tables\n\nQuery any registered tables using DuckDB SQL dialect!\n\n```bash\n$ laketower -c demo/laketower.yml tables query \"select date_trunc('day', time) as day, avg(temperature_2m) as mean_temperature from weather group by day order by day desc limit 3\"\n\n\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n\u2503 day \u2503 mean_temperature \u2503\n\u2521\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2547\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2529\n\u2502 2025-02-12 00:00:00+01:00 \u2502 5.099999904632568 \u2502\n\u2502 2025-02-11 00:00:00+01:00 \u2502 4.833333373069763 \u2502\n\u2502 2025-02-10 00:00:00+01:00 \u2502 2.1083333243926368 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n```\n\n## License\n\nLicensed under [GNU Affero General Public License v3.0 (AGPLv3)](LICENSE.md)\n\nCopyright (c) 2025 - present Romain Clement\n",
"bugtrack_url": null,
"license": "AGPL-3.0-or-later",
"summary": "Oversee your lakehouse",
"version": "0.2.0",
"project_urls": {
"Changelog": "https://github.com/datalpia/laketower/blob/master/CHANGELOG.md",
"Issues": "https://github.com/datalpia/laketower/issues",
"Repository": "https://github.com/datalpia/laketower"
},
"split_keywords": [
"data",
" delta-lake",
" lakehouse",
" sql"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "74ec08c82fc4ce7b34a8fde4c82ea0882cbbbde8929d4432746e7c023b4e26ae",
"md5": "7bfbe15ff8cd5f4cfcb191696785587e",
"sha256": "fe1f30d93a90d7330858c022887fedc1afacdb47d0997e0ba7710467e07ea219"
},
"downloads": -1,
"filename": "laketower-0.2.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "7bfbe15ff8cd5f4cfcb191696785587e",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<3.14,>=3.9",
"size": 28399,
"upload_time": "2025-02-25T22:42:01",
"upload_time_iso_8601": "2025-02-25T22:42:01.907228Z",
"url": "https://files.pythonhosted.org/packages/74/ec/08c82fc4ce7b34a8fde4c82ea0882cbbbde8929d4432746e7c023b4e26ae/laketower-0.2.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "164012f6748a092657ced8536f3823bd065299ab92963c6561f1c4f7413d2f2b",
"md5": "8a43b7ec933d6a7c7f80e33cfa8cb806",
"sha256": "c2ec0fc0730048ece36e5d773c3ee6922d611dcba64b247d5b802be50c2d8123"
},
"downloads": -1,
"filename": "laketower-0.2.0.tar.gz",
"has_sig": false,
"md5_digest": "8a43b7ec933d6a7c7f80e33cfa8cb806",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<3.14,>=3.9",
"size": 122933,
"upload_time": "2025-02-25T22:42:04",
"upload_time_iso_8601": "2025-02-25T22:42:04.383860Z",
"url": "https://files.pythonhosted.org/packages/16/40/12f6748a092657ced8536f3823bd065299ab92963c6561f1c4f7413d2f2b/laketower-0.2.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-02-25 22:42:04",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "datalpia",
"github_project": "laketower",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "laketower"
}