You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Cassandra对象映射器用now()生成UUID字段的记录?

使用Cassandra对象映射器(cqlengine)实现now()生成UUID

你之前的问题出在直接传递字符串'now()',对象映射器会把它当作普通字符串值,而非调用Cassandra内置的now()函数。用cqlengine(从你的模型代码判断是这个库)可以通过内置的函数封装轻松实现需求,无需编写原生查询。

正确实现步骤

1. 导入Now函数

cqlengine提供了functions.Now()来对应Cassandra的now()函数,需要先导入:

from cqlengine import functions

2. 修改模型定义

给owner_id字段设置默认值为functions.Now(),这样创建记录时如果不指定该字段,会自动调用Cassandra的now()生成UUID:

class OwnerUnique(models.Model):
    __keyspace__ = 'training'
    __table_name__ = 'owner_unique'

    name = columns.Text(primary_key=True)
    owner_id = columns.UUID(default=functions.Now())

3. 创建记录(含IF NOT EXISTS)

调用create()或create_async()方法时,加上if_not_exists=True参数即可实现原生查询里的IF NOT EXISTS逻辑:

同步创建

result = OwnerUnique.create(name="test_name", if_not_exists=True)
# 可以获取生成的owner_id
print(result.owner_id)

异步创建

async def create_unique_async(name: str):
    result = await OwnerUnique.create_async(name=name, if_not_exists=True)
    return result

手动指定now()(不依赖默认值)

如果不想设置默认值,也可以在创建时显式传入functions.Now():

OwnerUnique.create(name="test_name", owner_id=functions.Now(), if_not_exists=True)

为什么之前的方法失败?

  • 传入字符串'now()':对象映射器会将其作为普通字符串值插入,而非解析为Cassandra函数调用。
  • 设置default='now()':同样,字符串不会被识别为函数,只会作为固定的字符串默认值,这显然不符合UUID类型的要求。

内容的提问来源于stack exchange,提问作者Chameleon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 14:35:08