【问题标题】:Querying with cqlengine使用 cqlengine 查询
【发布时间】:2014-04-01 15:30:12
【问题描述】:

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

SELECT * FROM Movies

建立连接后如何继续查询

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

KEYSPACE 称为“TEST1”。

【问题讨论】:

    标签: cassandra cql cql3 object-object-mapping cqlengine


    【解决方案1】:

    阿比鲁普·萨卡尔,

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

    Current Object Mapper Documentation

    Legacy CQLEngine Documentation

    Installation:pip install cassandra-driver

    看看这个由 CQLEngine 的创建者 rustyrazorblade 提供的示例项目:

    Example Project - Meat bot

    请记住,CQLEngine 已合并到 DataStax Cassandra-driver:

    Official Python Cassandra Driver Documentation

    你会想做这样的事情:

    CQLEngine

    from cqlengine.connection import setup
    
    
    setup(['127.0.0.1'], 'keyspace_name', retry_connect=True)
    

    如果还需要创建keyspace:

    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)
    

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

    【讨论】:

    • 每次需要与数据库交互时是否需要建立连接?有没有办法通过应用程序使用现有的连接?
    【解决方案2】:

    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) 更新表格以匹配您的模型。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-28
        • 1970-01-01
        • 2019-03-18
        • 1970-01-01
        • 2019-01-13
        • 2023-03-26
        • 1970-01-01
        相关资源
        最近更新 更多