2014-02-28 22 views
0

我试图挂接运行在CherryPy上的我的web应用程序cqlengine CQL 3 object mapper。尽管documentation对查询非常清楚,但我仍然不知道如何在我的cassandra数据库中对现有表(和现有密钥空间)进行查询。例如,我已经有这个表格电影包含字段标题,评级,年。我想使CQL查询使用cqlengine查询

SELECT * FROM Movies 

我如何继续与查询建立与

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

KEYSPACE连接后,被称为“TEST1”。

回答

1

最直接的方式实现这一目标是使这反映现有CQL表的架构模型类,然后运行查询他们

0

cqlengine主要是为Cassandra的一个对象映射器。它不会询问现有数据库以便为现有表创建对象。相反,它通常打算用于相反的方向(即从python类创建表)。如果您想使用cqlengine查询现有表,则需要创建与现有表完全对应的python模型。例如,如果您当前的电影表有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)更新表格以匹配您的模型。

1

Abhiroop萨卡,

我强烈建议你通过所有的文档在阅读:

CQLEngine Documentation

而且通过CQLEngine,rustyrazorblade的创作者来看看这个例子项目:

Example Project - Meat bot

请记住,CQLEngine已合并我n要在DataStax卡桑德拉司机:

Official Python Cassandra Driver Documentation

你会想要做这样的事情:

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或在你的模型做.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 __unicode__(self): 
     return unicode(self.sometext) 

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

     return data 

个同步您的卡珊德拉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 .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 

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