如何通过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
相关产品推荐
相关产品推荐

