Skip to main content

Django backend for Snowflake

Project description

Snowflake backend for Django

Install and usage

Use the version of django-snowflake that corresponds to your version of Django. For example, to get the latest compatible release for Django 5.1.x:

pip install django-snowflake==5.1.*

The minor release number of Django doesn't correspond to the minor release number of django-snowflake. Use the latest minor release of each.

Configure the Django DATABASES setting similar to this:

DATABASES = {
    'default': {
        'ENGINE': 'django_snowflake',
        'NAME': 'MY_DATABASE',
        'SCHEMA': 'MY_SCHEMA',
        'WAREHOUSE': 'MY_WAREHOUSE',
        'USER': 'my_user',
        'PASSWORD': 'my_password',
        'ACCOUNT': 'my_account',
        # Include 'OPTIONS' if you need to specify any other
        # snowflake.connector.connect() parameters, documented at:
        # https://docs.snowflake.com/en/user-guide/python-connector-api.html#connect
        'OPTIONS': {
            # Examples:
            'role': 'MY_ROLE',
            # To use native Okta authenticators:
            # https://docs.snowflake.com/en/user-guide/admin-security-fed-auth-use#native-sso-okta-only
            'authenticator': 'https://example.okta.com',
            # To use private key authentication:
            'private_key_file': '<path>/rsa_key.p8',
            'private_key_file_pwd': 'my_passphrase',
        },
    },
}

Persistent connections

To use persisent connections, set Django's CONN_MAX_AGE and Snowflake Python Connector's client_session_keep_alive:

DATABASES = {
    'default': {
        # ...
        'CONN_MAX_AGE': None,
        'OPTIONS': {
            'client_session_keep_alive': True,
        },
    },
}

Notes on Django fields

  • Consistent with Snowflake's convention, this backend uppercases all database identifiers (table names, column names, etc.) unless they are quoted, e.g. db_table='"table_name"'.

  • Snowflake supports defining foreign key and unique constraints, however, it doesn't enforce them. Thus, Django manages these constraints and inspectdb detects them, but Django won't raise IntegrityError if they're violated.

  • Snowflake doesn't support indexes. Thus, Django ignores any indexes defined on models or fields.

  • Snowflake doesn't support check constraints, so the various PositiveIntegerField model fields allow negative values (though validation at the form level still works).

Notes on Django QuerySets

  • Snowflake has limited support for subqueries.

  • Valid values for QuerySet.explain()'s format parameter are 'json', 'tabular', and 'text'. The default is 'tabular'.

Known issues and limitations

This list isn't exhaustive. If you run into a problem, consult django_snowflake/features.py to see if a similar test is skipped. Please create an issue on GitHub if you encounter an issue worth documenting.

  • Snowflake doesn't support last_insert_id to retrieve the ID of a newly created object. Instead, this backend issues the query SELECT MAX(pk_name) FROM table_name to retrieve the ID. This is subject to race conditions if objects are created concurrently. This makes this backend inappropriate for use in web app use cases where multiple clients could be creating objects at the same time. Further, you should not manually specify an ID (e.g. MyModel(id=1)) when creating an object.

  • Due to snowflake-connector-python's lack of VARIANT support, some JSONField queries with complex JSON parameters don't work.

    For example, if value is a JSONField, this won't work:

    >>> JSONModel.objects.filter(value__k={"l": "m"})
    

    A workaround is:

    >>> from django.db.models.expressions import RawSQL
    >>> JSONModel.objects.filter(value__k=RawSQL("PARSE_JSON(%s)", ('{"l": "m"}',)))
    

    In addition, QuerySet.bulk_update() isn't supported for JSONField.

  • Interval math where the interval is a column is not supported.

  • Interval math with a null interval crashes.

Troubleshooting

Debug logging

To troubleshoot issues with connectivity to Snowflake, you can enable Snowflake Connector for Python's logging using Django's LOGGING setting.

This is a minimal addition to Django's default "loggers" configuration that enables the connector's DEBUG logging:

LOGGING = {
    
    "loggers": {
        
        "snowflake.connector": {
            "level": "DEBUG",
            "handlers": ["console"],
        },
    },
}

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django-snowflake-5.1.tar.gz (25.5 kB view details)

Uploaded Source

Built Distribution

django_snowflake-5.1-py3-none-any.whl (26.8 kB view details)

Uploaded Python 3

File details

Details for the file django-snowflake-5.1.tar.gz.

File metadata

  • Download URL: django-snowflake-5.1.tar.gz
  • Upload date:
  • Size: 25.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.12.0

File hashes

Hashes for django-snowflake-5.1.tar.gz
Algorithm Hash digest
SHA256 9224ccae0bab7a3bb89b85e5c360dfc49bace996a1f6d57e283c8d190d491adf
MD5 5dc3d8a9c03177dd7c7943d85cd3e545
BLAKE2b-256 f643e82865dc652f9ab1e82464034c8706781bb3e0b23fe6d52b2103b3b27bb6

See more details on using hashes here.

File details

Details for the file django_snowflake-5.1-py3-none-any.whl.

File metadata

File hashes

Hashes for django_snowflake-5.1-py3-none-any.whl
Algorithm Hash digest
SHA256 553dc77f4de83a5d15451de94b6fec7bc498014053c627c800dcf6375a7eced9
MD5 b587f22cb4145027686740b6ca7e0504
BLAKE2b-256 c5c27b6528a6ed256487c1bf9678b0bf9c5ac9201f9f22aacf74f2f288f5eaca

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page