跳转到主要内容

Django后端Snowflake

项目描述

Snowflake后端Django

安装和使用

使用与您的Django版本相对应的django-snowflake版本。例如,要获取Django 5.1.x的最新兼容版本

pip install django-snowflake==5.1.*

Django的次要版本号与django-snowflake的次要版本号不对应。使用每个的最后一个次要版本。

配置Django的DATABASES设置,例如以下

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',
        },
    },
}

持久连接

要使用持久连接,设置Django的CONN_MAX_AGE和Snowflake Python连接器的client_session_keep_alive

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

Django字段说明

  • Snowflake的约定一致,此后端将所有数据库标识符(表名、列名等)转换为大写,除非它们被引号括起来,例如:db_table='"table_name"'

  • Snowflake支持定义外键和唯一约束,但它不会强制执行这些约束。因此,Django管理这些约束,inspectdb会检测它们,但如果违反了这些约束,Django不会引发IntegrityError

  • Snowflake不支持索引。因此,Django忽略在模型或字段上定义的任何索引。

  • Snowflake不支持检查约束,因此各种PositiveIntegerField模型字段允许负值(尽管表单级别的验证仍然有效)。

关于Django查询集的注意事项

  • Snowflake对子查询的支持有限

  • QuerySet.explain()format参数的有效值是'json''tabular''text'。默认值是'tabular'

已知问题和限制

此列表并不详尽。如果您遇到问题,请查阅django_snowflake/features.py以查看是否有类似的测试被跳过。如果您遇到值得记录的问题,请在GitHub上创建一个问题

  • Snowflake不支持last_insert_id来检索新创建对象的ID。相反,此后端会发出查询SELECT MAX(pk_name) FROM table_name来检索ID。如果对象同时创建,则这可能导致竞态条件。这使得此后端不适合在多个客户端可能同时创建对象的Web应用场景中使用。此外,在创建对象时不应手动指定ID(例如:MyModel(id=1))。

  • 由于snowflake-connector-python的缺少VARIANT支持,一些具有复杂JSON参数的JSONField查询无法正常工作

    例如,如果valueJSONField,则以下操作不会成功

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

    一个解决方案是

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

    此外,QuerySet.bulk_update()不支持JSONField

  • 当间隔是列时,间隔数学不受支持

  • 当间隔为null时,间隔数学会导致崩溃

故障排除

调试日志

要解决与Snowflake连接的问题,您可以使用Django的LOGGING设置启用Snowflake Connector for Python的日志记录

这是Django默认"loggers"配置的附加最小配置,它启用了连接器的DEBUG日志记录

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

项目详细信息


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于 安装软件包 的信息。

源分发

django-snowflake-5.1.tar.gz (25.5 kB 查看哈希值)

上传时间

构建分发

django_snowflake-5.1-py3-none-any.whl (26.8 kB 查看哈希值)

上传时间 Python 3

由以下组织支持