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
查询无法正常工作。例如,如果
value
是JSONField
,则以下操作不会成功>>> 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"],
},
},
}
项目详细信息
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于 安装软件包 的信息。