Expressions¶
Column definitions, function columns, expression wrappers, and vector expressions used in query building.
Columns¶
- class sqlspec.builder.Column[source]¶
Bases:
objectRepresents a database column with Python operator support.
- vector_distance(other_vector, metric='euclidean')[source]¶
Calculate vector distance using specified metric.
Generates dialect-specific SQL for vector distance calculation: - PostgreSQL (pgvector): Operators <->, <=>, <#> - MySQL 9+: DISTANCE(col, vec, ‘METRIC’) function - Oracle 23ai+: VECTOR_DISTANCE(col, vec, METRIC) function
- Parameters:
other_vector¶ (
list[float] |Column|Expression) – Vector to compare against (list, Column, or SQLGlot expression).metric¶ (
str) – Distance metric to use. Options: - “euclidean”: L2 distance (default) - “cosine”: Cosine distance - “inner_product”: Negative inner product - “euclidean_squared”: L2² distance (Oracle only)
- Return type:
- Returns:
FunctionColumn expression for use in SELECT, WHERE, ORDER BY.
Examples
- Basic distance query with threshold:
>>> query = ( ... sql ... .select("*") ... .from_("docs") ... .where( ... Column("embedding").vector_distance( ... [0.1, 0.2], metric="euclidean" ... ) ... < 0.5 ... ) ... )
- Distance in SELECT clause with alias:
>>> query = ( ... sql ... .select( ... "id", ... Column("embedding") ... .vector_distance([0.1, 0.2]) ... .as_("dist"), ... ) ... .from_("docs") ... .order_by("dist") ... )
- Compare two vector columns:
>>> query = ( ... sql ... .select("*") ... .from_("pairs") ... .where( ... Column("vec1").vector_distance( ... Column("vec2"), metric="cosine" ... ) ... < 0.3 ... ) ... )
- cosine_similarity(other_vector)[source]¶
Calculate cosine similarity (1 - cosine_distance).
Convenience method that computes similarity instead of distance. Returns values in range [-1, 1] where 1 = identical vectors.
- Parameters:
other_vector¶ (
list[float] |Column|Expression) – Vector to compare against (list, Column, or expression).- Returns:
1 - cosine_distance(self, other_vector).
- Return type:
FunctionColumn expression
Examples
- Find most similar documents:
>>> query = ( ... sql ... .select( ... "id", ... Column("embedding") ... .cosine_similarity([0.1, 0.2]) ... .as_("score"), ... ) ... .from_("docs") ... .order_by(sql.column("score").desc()) ... .limit(10) ... )
- property sqlglot_expression: Expression¶
Get the underlying SQLGlot expression (public API).
- Returns:
The SQLGlot expression for this column
- class sqlspec.builder.ColumnExpression[source]¶
Bases:
objectBase class for column expressions that can be combined with operators.
- property sqlglot_expression: Expression¶
Get the underlying SQLGlot expression.
- class sqlspec.builder.FunctionColumn[source]¶
Bases:
objectRepresents the result of a SQL function call on a column.
- property sqlglot_expression: Expression¶
Return underlying SQLGlot expression.
Expression Wrappers¶
- class sqlspec.builder._expression_wrappers.ExpressionWrapper[source]¶
Bases:
objectBase wrapper for SQLGlot expressions.
- property expression: Expression¶
Get the underlying SQLGlot expression.
- class sqlspec.builder.AggregateExpression[source]¶
Bases:
ExpressionWrapperAggregate functions like COUNT, SUM, AVG.
- class sqlspec.builder.FunctionExpression[source]¶
Bases:
ExpressionWrapperGeneral SQL functions.
- class sqlspec.builder.MathExpression[source]¶
Bases:
ExpressionWrapperMathematical functions like ROUND.
- class sqlspec.builder.StringExpression[source]¶
Bases:
ExpressionWrapperString functions like UPPER, LOWER, LENGTH.
- class sqlspec.builder.ConversionExpression[source]¶
Bases:
ExpressionWrapperConversion functions like CAST, COALESCE.
Vector Expressions¶
- class sqlspec.builder.VectorDistance[source]¶
Bases:
ExpressionVector distance expression with dialect-specific generation.
Generates database-specific SQL for vector distance calculations: - PostgreSQL (pgvector): Operators <->, <=>, <#> - MySQL 9+: DISTANCE(col, vec, ‘METRIC’) function - Oracle 23ai+: VECTOR_DISTANCE(col, vec, METRIC) function - Generic: VECTOR_DISTANCE(col, vec, ‘METRIC’) function
The metric is stored as a raw string attribute (not parametrized) and drives dialect-specific generation at SQL build time.
- property left: Expression¶
Get the left operand (column).
- property right: Expression¶
Get the right operand (vector value).
Base Classes¶
- class sqlspec.builder.QueryBuilder[source]¶
Bases:
ABCAbstract base class for SQL query builders.
Provides common functionality for dialect handling, parameter management, and query construction using SQLGlot.
- __init__(dialect=None, schema=None, enable_optimization=True, optimize_joins=True, optimize_predicates=True, simplify_expressions=True)[source]¶
- get_expression()[source]¶
Get expression reference (no copy).
- Return type:
Expression|None- Returns:
The current SQLGlot expression or None if not set
- has_expression()[source]¶
Check if expression exists.
- Return type:
- Returns:
True if expression is set, False otherwise
- add_parameter_for_expression(value, context=None)[source]¶
Add a parameter for expression parameterization.
- add_parameter(value, name=None)[source]¶
Explicitly adds a parameter to the query.
This is useful for parameters that are not directly tied to a builder method like where or values.
- create_placeholder(value, base_name)[source]¶
Create placeholder expression with a unique parameter name.
- with_cte(alias, query)[source]¶
Adds a Common Table Expression (CTE) to the query.
- Parameters:
query¶ (
QueryBuilder|Select|str) – The CTE query, which can be another QueryBuilder instance, a raw SQL string, or a sqlglot Select expression.
- Returns:
The current builder instance for method chaining.
- Return type:
Self
- build(dialect=None)[source]¶
Builds the SQL query string and parameters.
- Parameters:
dialect¶ (
Union[str,Dialect,Type[Dialect],None]) – Optional dialect override. If provided, generates SQL for this dialect instead of the builder’s default dialect.- Returns:
A dataclass containing the SQL string and parameters.
- Return type:
Examples
# Use builder’s default dialect query = sql.select(“*”).from_(“products”) result = query.build()
# Override dialect at build time postgres_sql = query.build(dialect=”postgres”) mysql_sql = query.build(dialect=”mysql”)
- to_sql(show_parameters=False, dialect=None)[source]¶
Return SQL string with optional parameter substitution.
- Parameters:
show_parameters¶ (
bool) – If True, replace parameter placeholders with actual values (for debugging). If False (default), return SQL with parameter placeholders.dialect¶ (
Union[str,Dialect,Type[Dialect],None]) – Optional dialect override. If provided, generates SQL for this dialect instead of the builder’s default dialect.
- Return type:
- Returns:
SQL string with or without parameter values filled in
Examples
- Get SQL with placeholders (for execution):
sql_str = query.to_sql() # “SELECT * FROM products WHERE id = :id”
- Get SQL with values (for debugging):
sql_str = query.to_sql(show_parameters=True) # “SELECT * FROM products WHERE id = 123”
- Override dialect at output time:
postgres_sql = query.to_sql(dialect=”postgres”) mysql_sql = query.to_sql(dialect=”mysql”)
Warning
SQL with show_parameters=True is for debugging ONLY. Never execute SQL with interpolated parameters directly - use parameterized queries.
- to_statement(config=None)[source]¶
Converts the built query into a SQL statement object.
- Parameters:
config¶ (
StatementConfig|None) – Optional SQL configuration.- Returns:
A SQL statement object.
- Return type:
- __str__()[source]¶
Return the SQL string representation of the query.
- Returns:
The SQL string for this query.
- Return type:
- generate_unique_parameter_name(base_name)[source]¶
Generate unique parameter name (public API).
- Return type:
- build_static_expression(expression=None, parameters=None, *, cache_key=None, expression_factory=None, copy=True, optimize_expression=None, dialect=None)[source]¶
Compile a pre-built expression with optional caching and parameters.
Designed for hot paths that construct an AST once and reuse it with different parameters, avoiding repeated parse/optimize cycles.
- Parameters:
expression¶ (
Expression|None) – Pre-built sqlglot expression to render (required when cache_key is not provided).parameters¶ (
dict[str,Any] |None) – Optional parameter mapping to include in the result.cache_key¶ (
str|None) – When provided, the expression will be cached under this key.expression_factory¶ (
Callable[[],Expression] |None) – Factory used to build the expression on cache miss.copy¶ (
bool) – Copy the expression before rendering to avoid caller mutation.optimize_expression¶ (
bool|None) – Override builder optimization toggle for this call.dialect¶ (
Union[str,Dialect,Type[Dialect],None]) – Optional dialect override for SQL generation.
- Return type:
- Returns:
BuiltQuery containing SQL and parameters.
- class sqlspec.builder.ExpressionBuilder[source]¶
Bases:
QueryBuilderBuilder wrapper for a pre-parsed SQLGlot expression.
Parsing Utilities¶
- sqlspec.builder.extract_expression(value)[source]¶
Extract SQLGlot expression from value, handling wrapper types.
- sqlspec.builder.parse_column_expression(column_input, builder=None)[source]¶
Parse a column input that might be a complex expression.
Handles cases like: - Simple column names: “name” -> Column(this=name) - Qualified names: “users.name” -> Column(table=users, this=name) - Aliased columns: “name AS user_name” -> Alias(this=Column(name), alias=user_name) - Function calls: “MAX(price)” -> Max(this=Column(price)) - Complex expressions: “CASE WHEN … END” -> Case(…) - Custom Column objects from our builder - SQL objects with raw SQL expressions
- sqlspec.builder.parse_condition_expression(condition_input, builder=None)[source]¶
Parse a condition that might be complex SQL.
Handles cases like: - Simple conditions: “name = ‘John’” -> EQ(Column(name), Literal(‘John’)) - Tuple format: (“name”, “John”) -> EQ(Column(name), Literal(‘John’)) - Complex conditions: “age > 18 AND status = ‘active’” -> And(GT(…), EQ(…)) - Function conditions: “LENGTH(name) > 5” -> GT(Length(Column(name)), Literal(5))
- Parameters:
- Returns:
Parsed SQLGlot expression (usually a comparison or logical op)
- Return type:
exp.Expression
Notes
Database-specific parameter placeholders such as $1, %s, and :1 are rewritten to :param_N format so SQLGlot can parse them consistently.
- sqlspec.builder.parse_order_expression(order_input)[source]¶
Parse an ORDER BY expression that might include direction.
Handles cases like: - Simple column: “name” -> Column(this=name) - With direction: “name DESC” -> Ordered(this=Column(name), desc=True) - Qualified: “users.name ASC” -> Ordered(this=Column(table=users, this=name), desc=False) - Function: “COUNT(*) DESC” -> Ordered(this=Count(this=Star), desc=True)