1

我正在尝试将cqlengine CQL 3 对象映射器与我在 CherryPy 上运行的 Web 应用程序挂钩。尽管文档对查询非常清楚,但我仍然不知道如何对我的 cassandra 数据库中的现有表(和现有键空间)进行查询。例如,我已经有这张包含标题、评级、年份字段的电影表。我想做 CQL 查询

SELECT * FROM Movies

建立连接后如何继续查询

from cqlengine import connection
connection.setup(['127.0.0.1:9160'])

KEYSPACE被称为“TEST1”。

4

3 回答 3

6

阿比鲁普·萨卡尔,

我强烈建议您通读以下位置的所有文档:

当前对象映射器文档

旧版CQLEngine 文档

安装pip install cassandra-driver

看看 CQLEngine 的创建者 rustyrazorblade 的这个示例项目

示例项目 - 肉类机器人

请记住,CQLEngine 已合并到 DataStax Cassandra 驱动程序中:

官方 Python Cassandra 驱动程序文档

你会想做这样的事情:

CQLEngine <= 0.21.0:

from cqlengine.connection import setup


setup(['127.0.0.1'], 'keyspace_name', retry_connect=True)

如果您仍然需要创建密钥空间:

from cqlengine.management import create_keyspace


create_keyspace(
    'keyspace_name',
    replication_factor=1,
    strategy_class='SimpleStrategy'
)

设置您的 Cassandra 数据模型

您可以在同一个 .py 或您的 models.py 中执行此操作:

import datetime
import uuid

from cqlengine import columns, Model


class YourModel(Model):

    __key_space__ = 'keyspace_name'  # Not Required
    __table_name__ = 'columnfamily_name'  # Not Required

    some_int = columns.Integer(
        primary_key=True,
        partition_key=True
    )
    time = columns.TimeUUID(
        primary_key=True,
        clustering_order='DESC',
        default=uuid.uuid1,
    )
    some_uuid = columns.UUID(primary_key=True, default=uuid.uuid4)
    created = columns.DateTime(default=datetime.datetime.utcnow)
    some_text = columns.Text(required=True)

    def __str__(self):
        return self.some_text

    def to_dict(self):
        data = {
            'text': self.some_text,
            'created': self.created,
            'some_int': self.some_int,
        }

        return data

同步您的 Cassandra ColumnFamilies

from cqlengine.management import sync_table

from .models import YourModel


sync_table(YourModel)

考虑到以上所有内容,您可以将所有连接和同步放在一起,正如许多示例所概述的那样,例如这是我们项目中的 connection.py:

from cqlengine.connection import setup
from cqlengine.management import sync_table

from .models import YourTable


def cass_connect():
    setup(['127.0.0.1'], 'keyspace_name', retry_connect=True)
    sync_table(YourTable)

实际使用模型和数据

from __future__ import print_function

from .connection import cass_connect
from .models import YourTable


def add_data():
    cass_connect()
    YourTable.create(
        some_int=5,
        some_text='Test0'
    )

    YourTable.create(
        some_int=6,
        some_text='Test1'
    )

    YourTable.create(
        some_int=5,
        some_text='Test2'
    )


def query_data():
    cass_connect()
    query = YourTable.objects.filter(some_int=5)
    # This will output each YourTable entry where some_int = 5
    for item in query:
        print(item)

如有必要,请随时要求进一步澄清。

于 2015-04-30T18:36:07.197 回答
1

实现这一点最直接的方法是创建模型类来反映现有 cql 表的模式,然后对它们运行查询

于 2014-03-04T14:54:22.013 回答
1

cqlengine 主要是 Cassandra 的对象映射器。它不会询问现有数据库以便为现有表创建对象。相反,它通常旨在用于相反的方向(即从 python 类创建表)。如果要使用 cqlengine 查询现有表,则需要创建与现有表完全对应的 python 模型。

例如,如果您当前的 Movies 表有 3 列,id、title 和 release_date,您将需要创建一个包含这三列的 cqlengine 模型。此外,您需要确保类的table_name属性与数据库中的表名完全相同。

from cqlengine import columns, Model

class Movie(Model):
    __table_name__ = "movies"
    id = columns.UUID(primary_key=True)
    title = columns.Text()
    release_date = columns.Date()

关键是确保模型完全反映现有表。如果存在细微差异,您可以使用sync_table(MyModel)更新表以匹配您的模型。

于 2015-03-09T04:12:49.367 回答