|
| 1 | +from databricks import sql |
| 2 | +import os |
| 3 | + |
| 4 | +# Users of connector versions >= 2.9.0 and <= 3.0.0 can use the v3 retry behaviour by setting _enable_v3_retries=True |
| 5 | +# This flag will be deprecated in databricks-sql-connector~=3.0.0 as it will become the default. |
| 6 | +# |
| 7 | +# The new retry behaviour is defined in src/databricks/sql/auth/retry.py |
| 8 | +# |
| 9 | +# The new retry behaviour allows users to force the connector to automatically retry requests that fail with codes |
| 10 | +# that are not retried by default (in most cases only codes 429 and 503 are retried by default). Additional HTTP |
| 11 | +# codes to retry are specified as a list passed to `_retry_dangerous_codes`. |
| 12 | +# |
| 13 | +# Note that, as implied in the name, doing this is *dangerous* and should not be configured in all usages. |
| 14 | +# With the default behaviour, ExecuteStatement Thrift commands are only retried for codes 429 and 503 because |
| 15 | +# we can be certain at run-time that the statement never reached Databricks compute. These codes are returned by |
| 16 | +# the SQL gateway / load balancer. So there is no risk that retrying the request would result in a doubled |
| 17 | +# (or tripled etc) command execution. These codes are always accompanied by a Retry-After header, which we honour. |
| 18 | +# |
| 19 | +# However, if your use-case emits idempotent queries such as SELECT statements, it can be helpful to retry |
| 20 | +# for 502 (Bad Gateway) codes etc. In these cases, there is a possibility that the initial command _did_ reach |
| 21 | +# Databricks compute and retrying it could result in additional executions. Retrying under these conditions uses |
| 22 | +# an exponential back-off since a Retry-After header is not present. |
| 23 | + |
| 24 | +with sql.connect(server_hostname = os.getenv("DATABRICKS_SERVER_HOSTNAME"), |
| 25 | + http_path = os.getenv("DATABRICKS_HTTP_PATH"), |
| 26 | + access_token = os.getenv("DATABRICKS_TOKEN"), |
| 27 | + _enable_v3_retries = True, |
| 28 | + _retry_dangerous_codes=[502,400]) as connection: |
| 29 | + |
| 30 | + with connection.cursor() as cursor: |
| 31 | + cursor.execute("SELECT * FROM default.diamonds LIMIT 2") |
| 32 | + result = cursor.fetchall() |
| 33 | + |
| 34 | + for row in result: |
| 35 | + print(row) |
0 commit comments