googleapis / googleapis/google-cloud-python

Support calling SAFE_CAST via sqlalchemy

未关闭
#15,779 1 条评论 0 个 reaction 已指派 1 人 已被 @suzmue 认领 在 GitHub 查看
api: bigquery
主要语言
Python
星标
5.4k
派生
1.8k
平均合并
3 天 4 小时
30 天内合并 PR
122

描述

**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.

贡献指南

打开贡献指南

评估

这个 Issue 还没有评估数据。

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。