googleapis / googleapis/google-cloud-python

Support calling SAFE_CAST via sqlalchemy

Open
#15,779 1 comment 0 reactions 1 assignee Claimed by @suzmue View on GitHub
api: bigquery
Dominant language
Python
Stars
5.4k
Forks
1.8k
Avg merge
3d 4h
Merged PRs (30d)
122

Description

**Is your feature request related to a problem? Please describe.**
I could not find a way to use [SAFE_CAST](https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators#safe_casting) which returns NULL if the cast fails rather than failing the query.

**Describe the solution you'd like**
A custom `safe_cast` function provided by the library that compiles to `SAFE_CAST`.

**Describe alternatives you've considered**
I can implement a custom `safe_cast` function within my codebase. But, I would have to subclass `sqlalchemy.sql.Cast` (say `SafeCast`) and override the `visit_cast` function in the bigquery dialect to compile `SafeCast` into `SAFE_CAST(...)` instead of `CAST(...).

```python
class SafeCast(Cast):
pass

def safe_cast(col: ColumnElement, type_: TypeEngine)) -> SafeCast:
return SafeCast(col, type_)

# Define custom Bigquery dialect and compiler with
def visit_cast(self, cast, **kwargs):
if isinstance(cast, SafeCast):
return "SAFE_CAST(%s AS %s)" % (
cast.clause._compiler_dispatch(self, **kwargs),
cast.typeclause._compiler_dispatch(self, **kwargs),
)
else:
return super().visit_cast(cast, **kwargs)

```

**Additional context**
Add any other context or screenshots about the feature request here.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.