如何从 python cassandra 驱动程序传递 cassandra 函数?
Posted
技术标签:
【中文标题】如何从 python cassandra 驱动程序传递 cassandra 函数?【英文标题】:How to pass cassandra function from python cassandra driver? 【发布时间】:2017-05-31 17:43:29 【问题描述】:我有代码
from uuid import uuid4
from uuid import uuid1
from cassandra.cqlengine import columns, connection
from cassandra.cqlengine.models import Model
from cassandra.cqlengine.management import sync_table
class BaseModel(Model):
__abstract__ = True
id = columns.UUID(primary_key=True, default=uuid4)
created_timestamp = columns.TimeUUID(primary_key=True,
clustering_order='DESC',
default=uuid1)
deleted = columns.Boolean(required=True, default=False)
class OtherModel(BaseModel):
__table_name__ = 'other_table'
name = columns.Text(required=True, default='')
if __name__ == '__main__':
connection.setup(hosts=['localhost'],
default_keyspace='test')
sync_table(OtherModel)
cassandra
中有now()
函数,可以让current time
创建记录。
我尝试使用INSERT
查询创建记录。
cqlsh> INSERT INTO test.other_table ("id", "created_timestamp", "deleted", "name") VALUES (3c156369-6d71-40e2-933f-b48fdda7681f, now(), false, 'test');
但是当我尝试使用
created_timestamp = columns.TimeUUID(primary_key=True,
clustering_order='DESC',
default='now()')
验证时出错。
我试图覆盖TimeUUID
列,并从validate
函数返回now()
。
但它卡在插入记录中。
2017-01-16 12:20:06 [DEBUG] cassandra.cqlengine.connection: INSERT INTO test.other_table ("deleted", "id", "created_timestamp", "name") VALUES (%(0)s, %(1)s, %(2)s, %(3)s)
...
...
result = session.execute(query, params, timeout=timeout)
File "cassandra/cluster.py", line 1710, in cassandra.cluster.Session.execute (cassandra/cluster.c:30976)
return self.execute_async(query, parameters, trace, custom_payload, timeout).result()
File "cassandra/cluster.py", line 3343, in cassandra.cluster.ResponseFuture.result (cassandra/cluster.c:68510)
raise self._final_exception
InvalidRequest: Error from server: code=2200 [Invalid query] message="Invalid STRING constant (now()) for "created_timestamp" of type timeuuid"
我试过直接插入查询。
from cassandra.cqlengine import connection
if __name__ == '__main__':
connection.setup(hosts=['localhost'],
default_keyspace='test')
session = connection.get_session()
insert_query = """INSERT INTO test.other_table ("id", "created_timestamp", "deleted", "name") VALUES (%(0)s, %(1)s, %(2)s, %(3)s)"""
params = '0': '3c156369-6d71-40e2-933f-b48fdda7681f', '2': False, '3': 'name', '1': 'now()'
session.execute(insert_query, params)
但这也给出了同样的错误:(。
有什么方法可以从python
驱动程序中传递default
中的cassandra函数吗?
【问题讨论】:
【参考方案1】:它不喜欢将now()
作为参数传递。通过从您的 params
中删除 now()
并将其添加到 VALUES 子句中的查询字符串中,我能够让您的(较低的)代码工作:
insert_query = """INSERT INTO other_table
("id", "created_timestamp", "deleted", "name")
VALUES (%(0)s, now(), %(1)s, %(2)s)"""
session.execute(insert_query, params)
...
aploetz@cqlsh:***> SELECT * FROm other_table ;
id | created_timestamp | deleted | name
--------------------------------------+--------------------------------------+---------+------
3c156369-6d71-40e2-933f-b48fdda7681f | da509470-dcc9-11e6-b047-2ff6499dee60 | False | name
(1 rows)
【讨论】:
有什么方法可以使用cassandra python
驱动ORM而不直接INSERT
查询?
@Lafada 我找到了几个例子,但一个是代码中的客户端datetime.now()
,另一个是uuid.uuid1()
,但看起来你已经尝试过了。我稍后会四处搜索,看看我能找到什么,但其他明智的做法是检查这些文档,看看你是否能找到任何东西:datastax.github.io/python-driver/object_mapper.htmldatastax.github.io/python-driver/getting_started.html
通常,ORM column
具有设置值的属性,将在服务器端执行,在我们的例子中,我们希望在服务器端执行now()
函数。我试图在cassandra driver
中找到相同的属性,但是还没有运气:(
你对Model
有什么帮助吗?以上是关于如何从 python cassandra 驱动程序传递 cassandra 函数?的主要内容,如果未能解决你的问题,请参考以下文章
使用 cassandra 的 python 驱动程序创建新记录时如何设置服务器端时间戳
如何在 Python Cassandra 中获取最后插入的 id?