Skip to content

SSL Certificate Error Issue before and after Python 3.11.13 with Databricks Instance #585

Open
@narquette

Description

@narquette

Overview

When I try to use different versions of python to connect to a databricks environment, I get an SSL certificate issue. It appears to be resolved in 3.11.13 but is broken in versions below (e.g. 3.11.11) and above (3.12, 3.13). Please note that you will need to test with an environment that require an ssl certificate.

Recreation Steps

  1. Setup environment as below
  2. Run script
uv run main.py --python 3.11.11

Expected - The script will output a row count for the specific table
Actual - An SSLVerificationError will happen

Hardware Info

  • macOS - 15.5
  • chip - Apple M4 Pro

Affected Python Version

  • 3.11.11, <3.11.13
  • > 3.11.13

Setup

setup uv project

uv init dbks_testing --python

sample uv project template

[project]
name = "dbks-testing"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.11"
dependencies = [
    "databricks-sqlalchemy>=2.0.6",
]

script to verify issue

you will need to change the table variable to a valid table for your schema

def main():

    access_token = os.getenv("DATABRICKS_TOKEN")
    server_hostname = os.getenv("DATABRICKS_SERVER_HOSTNAME")
    http_path = os.getenv("DATABRICKS_HTTP_PATH")
    catalog = os.getenv("DATABRICKS_CATALOG")
    schema = os.getenv("DATABRICKS_SCHEMA")

    engine = create_engine(
        url=f"databricks://token:{access_token}@{server_hostname}?" +
            f"http_path={http_path}&catalog={catalog}&schema={schema}"
    )

    session = Session(engine)

    account = Table(table, MetaData(schema=schema), autoload_with=engine)

    print(f"Table count for {account.name} is {session.query(account).count()}")


if __name__ == "__main__":

    # add logging
    logging.getLogger("databricks.sql").setLevel(logging.DEBUG)
    logging.basicConfig(filename="results.log",
                        level=logging.DEBUG,
                        format="%(asctime)s - %(name)s - %(levelname)s - %(message)s")

    # set variables need for main
    table = "account"

    main()

Run command in project

uv run main.py --python 3.11.11

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions