RepoSnowflake (Arctic)Snowflake (Arctic)published Oct 11, 2021seen 5d

Snowflake-Labs/django-snowflake

Python

Open original ↗

Captured source

source ↗
published Oct 11, 2021seen 5dcaptured 9hhttp 200method plain

Snowflake-Labs/django-snowflake

Language: Python

License: MIT

Stars: 83

Forks: 22

Open issues: 14

Created: 2021-10-11T13:28:32Z

Pushed: 2026-06-06T09:55:01Z

Default branch: master

Fork: no

Archived: no

README:

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 6.0.x:

pip install django-snowflake==6.0.*

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': '/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

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.

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"],
},
},
}