bigquery-emulator
bigquery-emulator copied to clipboard
Fix error response status code when dataset or job already exists
The official BigQuery documentation's error messages state that when creating a job, dataset, or table, a response of 409 should be returned if they already exist.
Currently, I have found that only the table portion has the correct response of 409, while the other two always respond with 500. Therefore, I am submitting this PR to fix this issue.
Additionally, the documentation mentions that The error also returns when a job's writeDisposition property is set to WRITE_EMPTY and the destination table accessed by the job already exists.
I have not implemented this part, but it may be considered for future improvements.
This is my first PR of this repo, so please let me know if there are any issues with my PR. Thank you.
I'm running into this too and was just about to consider contributing and fixing it. This is my workaround:
def create_dataset(self, dataset, exists_ok=False):
# The exists_ok flag doesn't seem to work with the emulator,
# so work around it.
try:
return self._client.create_dataset(dataset, retry=None)
except google.api_core.exceptions.InternalServerError as e:
errors = e.errors
dataset_basename = dataset.split('.')[-1]
if exists_ok and re.match(rf'dataset {dataset_basename} is already created', errors[0]["message"]):
return
raise e
Obviously, it would be better to fix it in the emulator! Let me know if I can help with anything.
@goccy hi just wondering what I can do to help get this PR through?