From 0af48fcdde5d20ceb10190044d03087d63dd8895 Mon Sep 17 00:00:00 2001 From: Diego Imbert Date: Thu, 27 Nov 2025 17:57:31 +0100 Subject: [PATCH] basic python datatable client --- python-client/wmill/wmill/client.py | 30 ++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/python-client/wmill/wmill/client.py b/python-client/wmill/wmill/client.py index c142c75eed..3557fa3518 100644 --- a/python-client/wmill/wmill/client.py +++ b/python-client/wmill/wmill/client.py @@ -1015,6 +1015,10 @@ class Windmill: }, ) + def datatable(self, name: str = "main"): + return DataTableClient(self, name) + + def init_global_client(f): @functools.wraps(f) @@ -1555,7 +1559,6 @@ def run_inline_script_preview( args=args, ) - @init_global_client def username_to_email(username: str) -> str: """ @@ -1566,6 +1569,14 @@ def username_to_email(username: str) -> str: return _client.username_to_email(username) +@init_global_client +def datatable(name: str = "main"): + return _client.datatable(name) + +@init_global_client +def ducklake(name: str = "main"): + return _client.datatable(name) + def task(*args, **kwargs): from inspect import signature @@ -1663,3 +1674,20 @@ def stream_result(stream) -> None: """ for text in stream: append_to_result_stream(text) + +class DataTableClient: + def __init__(self, client: Windmill, name: str): + self.client = client + self.name = name + def fetch(self, sql: str, *args): + args_dict = {} + args_def = "" + for i, arg in enumerate(args): + args_dict[f"arg{i+1}"] = arg + args_def += f"-- ${i+1} arg{i+1}\n" + sql = args_def + sql + return self.client.run_inline_script_preview( + content=sql, + language="postgresql", + args={"database": f"datatable://{self.name}", **args_dict}, + ) \ No newline at end of file