feat(datatables): take the sdk role as an options argument

This commit is contained in:
Diego Imbert
2026-08-25 14:08:37 +02:00
parent 6228e266a1
commit 665cadbca6
12 changed files with 83 additions and 41 deletions
+15 -9
View File
@@ -1102,8 +1102,8 @@ parseS3Object(s3Object: S3Object): S3ObjectRecord
/**
* Create a SQL template function for PostgreSQL/datatable queries
* @param name - Database/datatable name (default: "main")
* @param role - Data table role to run as, on a datatable with permissions
* enabled (default: the data table's default role)
* @param opts - Optional settings; \`role\` runs the query as that data table
* role (default: the data table's default role)
* @returns SQL template function for building parameterized queries
* @example
* let sql = wmill.datatable()
@@ -1113,8 +1113,10 @@ parseS3Object(s3Object: S3Object): S3ObjectRecord
* SELECT * FROM friends
* WHERE name = \${name} AND age = \${age}::int
* \`.fetch()
* @example
* let sql = wmill.datatable('main', { role: 'operator' })
*/
datatable(name: string = "main", role?: string): DatatableSqlTemplateFunction
datatable(name: string = "main", opts?: DatatableOptions): DatatableSqlTemplateFunction
/**
* Create a SQL template function for DuckDB/ducklake queries
@@ -1887,8 +1889,8 @@ parseS3Object(s3Object: S3Object): S3ObjectRecord
/**
* Create a SQL template function for PostgreSQL/datatable queries
* @param name - Database/datatable name (default: "main")
* @param role - Data table role to run as, on a datatable with permissions
* enabled (default: the data table's default role)
* @param opts - Optional settings; \`role\` runs the query as that data table
* role (default: the data table's default role)
* @returns SQL template function for building parameterized queries
* @example
* let sql = wmill.datatable()
@@ -1898,8 +1900,10 @@ parseS3Object(s3Object: S3Object): S3ObjectRecord
* SELECT * FROM friends
* WHERE name = \${name} AND age = \${age}::int
* \`.fetch()
* @example
* let sql = wmill.datatable('main', { role: 'operator' })
*/
datatable(name: string = "main", role?: string): DatatableSqlTemplateFunction
datatable(name: string = "main", opts?: DatatableOptions): DatatableSqlTemplateFunction
/**
* Create a SQL template function for DuckDB/ducklake queries
@@ -2766,8 +2770,8 @@ parseS3Object(s3Object: S3Object): S3ObjectRecord
/**
* Create a SQL template function for PostgreSQL/datatable queries
* @param name - Database/datatable name (default: "main")
* @param role - Data table role to run as, on a datatable with permissions
* enabled (default: the data table's default role)
* @param opts - Optional settings; \`role\` runs the query as that data table
* role (default: the data table's default role)
* @returns SQL template function for building parameterized queries
* @example
* let sql = wmill.datatable()
@@ -2777,8 +2781,10 @@ parseS3Object(s3Object: S3Object): S3ObjectRecord
* SELECT * FROM friends
* WHERE name = \${name} AND age = \${age}::int
* \`.fetch()
* @example
* let sql = wmill.datatable('main', { role: 'operator' })
*/
datatable(name: string = "main", role?: string): DatatableSqlTemplateFunction
datatable(name: string = "main", opts?: DatatableOptions): DatatableSqlTemplateFunction
/**
* Create a SQL template function for DuckDB/ducklake queries
+6 -3
View File
@@ -1408,7 +1408,7 @@ class Windmill:
},
)
def datatable(self, name: str = "main", role: Optional[str] = None):
def datatable(self, name: str = "main", *, role: Optional[str] = None):
"""Get a DataTable client for SQL queries.
Args:
@@ -2242,7 +2242,7 @@ def username_to_email(username: str) -> str:
@init_global_client
def datatable(name: str = "main", role: Optional[str] = None) -> DataTableClient:
def datatable(name: str = "main", *, role: Optional[str] = None) -> DataTableClient:
"""Get a DataTable client for SQL queries.
Args:
@@ -2252,8 +2252,11 @@ def datatable(name: str = "main", role: Optional[str] = None) -> DataTableClient
Returns:
DataTableClient instance
Example:
wmill.datatable("main", role="operator")
"""
return _client.datatable(name, role)
return _client.datatable(name, role=role)
@init_global_client
def ducklake(name: str = "main") -> DucklakeClient:
+13 -6
View File
@@ -1800,8 +1800,8 @@ parseS3Object(s3Object: S3Object): S3ObjectRecord
/**
* Create a SQL template function for PostgreSQL/datatable queries
* @param name - Database/datatable name (default: "main")
* @param role - Data table role to run as, on a datatable with permissions
* enabled (default: the data table's default role)
* @param opts - Optional settings; \`role\` runs the query as that data table
* role (default: the data table's default role)
* @returns SQL template function for building parameterized queries
* @example
* let sql = wmill.datatable()
@@ -1811,8 +1811,10 @@ parseS3Object(s3Object: S3Object): S3ObjectRecord
* SELECT * FROM friends
* WHERE name = \${name} AND age = \${age}::int
* \`.fetch()
* @example
* let sql = wmill.datatable('main', { role: 'operator' })
*/
datatable(name: string = "main", role?: string): DatatableSqlTemplateFunction
datatable(name: string = "main", opts?: DatatableOptions): DatatableSqlTemplateFunction
/**
* Create a SQL template function for DuckDB/ducklake queries
@@ -2968,8 +2970,8 @@ interface DatatableSqlTemplateFunction {
Create a SQL template function for PostgreSQL/datatable queries
@param name - Database/datatable name (default: "main")
@param role - Data table role to run as, on a datatable with permissions
enabled (default: the data table's default role)
@param opts - Optional settings; \`role\` runs the query as that data table
role (default: the data table's default role)
@returns SQL template function for building parameterized queries
@example
let sql = wmill.datatable()
@@ -2979,9 +2981,11 @@ await sql\`
SELECT * FROM friends
WHERE name = \${name} AND age = \${age}::int
\`.fetch()
@example
let sql = wmill.datatable('main', { role: 'operator' })
\`\`\`typescript
function datatable(name: string = "main",
role?: string): DatatableSqlTemplateFunction
opts?: DatatableOptions): DatatableSqlTemplateFunction
\`\`\`
`;
@@ -2998,6 +3002,9 @@ Import: \`import wmill\`
#
# Returns:
# DataTableClient instance
#
# Example:
# wmill.datatable("main", role="operator")
def datatable(name: str = 'main', role: Optional[str] = None) -> DataTableClient
# Client for executing SQL queries against Windmill DataTables.
+5 -3
View File
@@ -1992,8 +1992,8 @@ parseS3Object(s3Object: S3Object): S3ObjectRecord
/**
* Create a SQL template function for PostgreSQL/datatable queries
* @param name - Database/datatable name (default: "main")
* @param role - Data table role to run as, on a datatable with permissions
* enabled (default: the data table's default role)
* @param opts - Optional settings; `role` runs the query as that data table
* role (default: the data table's default role)
* @returns SQL template function for building parameterized queries
* @example
* let sql = wmill.datatable()
@@ -2003,8 +2003,10 @@ parseS3Object(s3Object: S3Object): S3ObjectRecord
* SELECT * FROM friends
* WHERE name = ${name} AND age = ${age}::int
* `.fetch()
* @example
* let sql = wmill.datatable('main', { role: 'operator' })
*/
datatable(name: string = "main", role?: string): DatatableSqlTemplateFunction
datatable(name: string = "main", opts?: DatatableOptions): DatatableSqlTemplateFunction
/**
* Create a SQL template function for DuckDB/ducklake queries
@@ -11,6 +11,9 @@ Import: `import wmill`
#
# Returns:
# DataTableClient instance
#
# Example:
# wmill.datatable("main", role="operator")
def datatable(name: str = 'main', role: Optional[str] = None) -> DataTableClient
# Client for executing SQL queries against Windmill DataTables.
@@ -62,8 +62,8 @@ interface DatatableSqlTemplateFunction {
Create a SQL template function for PostgreSQL/datatable queries
@param name - Database/datatable name (default: "main")
@param role - Data table role to run as, on a datatable with permissions
enabled (default: the data table's default role)
@param opts - Optional settings; `role` runs the query as that data table
role (default: the data table's default role)
@returns SQL template function for building parameterized queries
@example
let sql = wmill.datatable()
@@ -73,7 +73,9 @@ await sql`
SELECT * FROM friends
WHERE name = ${name} AND age = ${age}::int
`.fetch()
@example
let sql = wmill.datatable('main', { role: 'operator' })
```typescript
function datatable(name: string = "main",
role?: string): DatatableSqlTemplateFunction
opts?: DatatableOptions): DatatableSqlTemplateFunction
```
@@ -557,8 +557,8 @@ parseS3Object(s3Object: S3Object): S3ObjectRecord
/**
* Create a SQL template function for PostgreSQL/datatable queries
* @param name - Database/datatable name (default: "main")
* @param role - Data table role to run as, on a datatable with permissions
* enabled (default: the data table's default role)
* @param opts - Optional settings; `role` runs the query as that data table
* role (default: the data table's default role)
* @returns SQL template function for building parameterized queries
* @example
* let sql = wmill.datatable()
@@ -568,8 +568,10 @@ parseS3Object(s3Object: S3Object): S3ObjectRecord
* SELECT * FROM friends
* WHERE name = ${name} AND age = ${age}::int
* `.fetch()
* @example
* let sql = wmill.datatable('main', { role: 'operator' })
*/
datatable(name: string = "main", role?: string): DatatableSqlTemplateFunction
datatable(name: string = "main", opts?: DatatableOptions): DatatableSqlTemplateFunction
/**
* Create a SQL template function for DuckDB/ducklake queries
@@ -728,8 +728,8 @@ parseS3Object(s3Object: S3Object): S3ObjectRecord
/**
* Create a SQL template function for PostgreSQL/datatable queries
* @param name - Database/datatable name (default: "main")
* @param role - Data table role to run as, on a datatable with permissions
* enabled (default: the data table's default role)
* @param opts - Optional settings; `role` runs the query as that data table
* role (default: the data table's default role)
* @returns SQL template function for building parameterized queries
* @example
* let sql = wmill.datatable()
@@ -739,8 +739,10 @@ parseS3Object(s3Object: S3Object): S3ObjectRecord
* SELECT * FROM friends
* WHERE name = ${name} AND age = ${age}::int
* `.fetch()
* @example
* let sql = wmill.datatable('main', { role: 'operator' })
*/
datatable(name: string = "main", role?: string): DatatableSqlTemplateFunction
datatable(name: string = "main", opts?: DatatableOptions): DatatableSqlTemplateFunction
/**
* Create a SQL template function for DuckDB/ducklake queries
@@ -728,8 +728,8 @@ parseS3Object(s3Object: S3Object): S3ObjectRecord
/**
* Create a SQL template function for PostgreSQL/datatable queries
* @param name - Database/datatable name (default: "main")
* @param role - Data table role to run as, on a datatable with permissions
* enabled (default: the data table's default role)
* @param opts - Optional settings; `role` runs the query as that data table
* role (default: the data table's default role)
* @returns SQL template function for building parameterized queries
* @example
* let sql = wmill.datatable()
@@ -739,8 +739,10 @@ parseS3Object(s3Object: S3Object): S3ObjectRecord
* SELECT * FROM friends
* WHERE name = ${name} AND age = ${age}::int
* `.fetch()
* @example
* let sql = wmill.datatable('main', { role: 'operator' })
*/
datatable(name: string = "main", role?: string): DatatableSqlTemplateFunction
datatable(name: string = "main", opts?: DatatableOptions): DatatableSqlTemplateFunction
/**
* Create a SQL template function for DuckDB/ducklake queries
@@ -730,8 +730,8 @@ parseS3Object(s3Object: S3Object): S3ObjectRecord
/**
* Create a SQL template function for PostgreSQL/datatable queries
* @param name - Database/datatable name (default: "main")
* @param role - Data table role to run as, on a datatable with permissions
* enabled (default: the data table's default role)
* @param opts - Optional settings; `role` runs the query as that data table
* role (default: the data table's default role)
* @returns SQL template function for building parameterized queries
* @example
* let sql = wmill.datatable()
@@ -741,8 +741,10 @@ parseS3Object(s3Object: S3Object): S3ObjectRecord
* SELECT * FROM friends
* WHERE name = ${name} AND age = ${age}::int
* `.fetch()
* @example
* let sql = wmill.datatable('main', { role: 'operator' })
*/
datatable(name: string = "main", role?: string): DatatableSqlTemplateFunction
datatable(name: string = "main", opts?: DatatableOptions): DatatableSqlTemplateFunction
/**
* Create a SQL template function for DuckDB/ducklake queries
+4 -1
View File
@@ -85,7 +85,10 @@ export interface DatatableSqlTemplateFunction extends SqlTemplateFunction {
query<T = any>(sql: string, ...params: any[]): SqlStatement<T>;
}
export declare function datatable(name?: string, role?: string): DatatableSqlTemplateFunction;
export interface DatatableOptions {
role?: string;
}
export declare function datatable(name?: string, opts?: DatatableOptions): DatatableSqlTemplateFunction;
export declare function ducklake(name: string): SqlTemplateFunction;
export interface DucklakeMaterializeOptions {
+12 -4
View File
@@ -108,6 +108,12 @@ export interface DatatableSqlTemplateFunction extends SqlTemplateFunction {
query<T = any>(sql: string, ...params: any[]): SqlStatement<T>;
}
export interface DatatableOptions {
/** Data table role to run as, on a data table with permissions enabled.
* Omitted means the data table's default role. */
role?: string;
}
// ---------------------------------------------------------------------------
// Provider interface — captures what differs between datatable and ducklake
// ---------------------------------------------------------------------------
@@ -332,8 +338,8 @@ function buildSqlTemplateFunction(provider: SqlProvider): SqlTemplateFunction {
/**
* Create a SQL template function for PostgreSQL/datatable queries
* @param name - Database/datatable name (default: "main")
* @param role - Data table role to run as, on a datatable with permissions
* enabled (default: the data table's default role)
* @param opts - Optional settings; `role` runs the query as that data table
* role (default: the data table's default role)
* @returns SQL template function for building parameterized queries
* @example
* let sql = wmill.datatable()
@@ -343,13 +349,15 @@ function buildSqlTemplateFunction(provider: SqlProvider): SqlTemplateFunction {
* SELECT * FROM friends
* WHERE name = ${name} AND age = ${age}::int
* `.fetch()
* @example
* let sql = wmill.datatable('main', { role: 'operator' })
*/
export function datatable(
name: string = "main",
role?: string
opts?: DatatableOptions
): DatatableSqlTemplateFunction {
let { name: n, schema } = parseName(name);
let provider = datatableProvider(n, schema, role);
let provider = datatableProvider(n, schema, opts?.role);
let sqlFn = buildSqlTemplateFunction(provider) as DatatableSqlTemplateFunction;
// `.query(sql, ...params)` is for SQL strings that already contain
// positional placeholders ($1, $2, ...). We DON'T go through the template