0

我有代码

import time

from uuid import uuid4

import cassandra
from cassandra.cqlengine.models import Model
from cassandra.cqlengine.query import BatchQuery
from cassandra.cqlengine import columns, connection
from cassandra.cqlengine.management import sync_table


class StudentModel(Model):
    __table_name__ = 'student'
    id = columns.UUID(primary_key=True, default=uuid4)
    created_timestamp = columns.TimeUUID(primary_key=True,
                                         clustering_order='DESC',
                                         default=cassandra.util.uuid_from_time(time.time()))
    name = columns.Text(required=True, default='')

class ClassRoomModel(Model):
    __table_name__ = 'class_room'
    id = columns.UUID(primary_key=True, default=uuid4)
    created_timestamp = columns.TimeUUID(primary_key=True,
                                         clustering_order='DESC',
                                         default=cassandra.util.uuid_from_time(time.time()))
    name = columns.Text(required=True, default='')

class StudentToClass(Model):
    __table_name__ = 'student_to_class_mapping'
    class_room_id = columns.UUID(primary_key=True)
    created_timestamp = \
        columns.TimeUUID(primary_key=True,
                         clustering_order='DESC',
                         default=cassandra.util.uuid_from_time(time.time()))
    student_id = columns.UUID()

class ClassToStudent(Model):
    __table_name__ = 'class_to_student_mapping'
    student_id = columns.UUID(primary_key=True)
    created_timestamp = \
        columns.TimeUUID(primary_key=True,
                         clustering_order='DESC',
                         default=cassandra.util.uuid_from_time(time.time()))
    class_room_id = columns.UUID()

if __name__ == '__main__':
    connection.setup(hosts=['localhost'],
                     default_keyspace='test')
    sync_table(StudentModel)
    sync_table(ClassRoomModel)
    sync_table(StudentToClass)
    sync_table(ClassToStudent)

    students = []
    for i in xrange(100):
        students.append(StudentModel.create(name='student' + str(i)))

    class_room = ClassRoomModel.create(name='class1')

    for student in students:
        print "Creating batch for: ", student.name
        with BatchQuery() as batch_query:
            ClassToStudent.batch(batch_query).create(
                student_id=student.id, class_room_id=class_room.id)
            StudentToClass.batch(batch_query).create(
                student_id=student.id, class_room_id=class_room.id)

此代码工作正常,它也创建了记录。当我检查记录数时,它匹配 3 个表,但对于test.student_to_class_mapping,它必须是 100,但它只给出1.

cqlsh> select count(*) from test.student;

 count
-------
   100

(1 rows)
cqlsh> select count(*) from test.class_room ;

 count
-------
     1

(1 rows)
cqlsh> select count(*) from test.class_to_student_mapping;

 count
-------
   100

(1 rows)
cqlsh> select count(*) from test.student_to_class_mapping ;

 count
-------
     1

(1 rows)

我发现了这个问题,逻辑上它是正确的,唯一的问题是clusturing_keytest.student_to_class_mapping.

created_timestamp = \
    columns.TimeUUID(primary_key=True,
                     clustering_order='DESC',
                     default=cassandra.util.uuid_from_time(time.time()))

cassandra.util.uuid_from_time(time.time())无法Unique为每条记录生成 uuid。我可以使用uuid1,但我已经面临uuid1.

我知道,我们可以使用now(),我将代码更改为

from cassandra.query import BatchStatement, SimpleStatement
from cassandra.cqlengine import connection
...
...
    batch_query = BatchStatement()
    batch_query.add(
        SimpleStatement('INSERT INTO {0} '
            '("student_id", "created_timestamp", "class_room_id") '
            'VALUES ({1}, now(), {2})'.format(
                StudentToClass.column_family_name(),
                student.id, class_room.id)))
    batch_query.add(
        SimpleStatement('INSERT INTO {0} '
            '("student_id", "created_timestamp", "class_room_id") '
            'VALUES ({1}, now(), {2})'.format(
                ClassToStudent.column_family_name(),
                student.id, class_room.id)))   
    connection.session.execute(batch_query) 
...
... 

现在它工作正常并按照逻辑创建所有记录。

我想知道,有什么方法可以使用now()Model的create方法吗?

4

1 回答 1

2

发生了什么事:

default = None
    the default value, can be a value or a callable (no args)

(来自https://datastax.github.io/python-driver/api/cassandra/cqlengine/columns.html

你的线

default=cassandra.util.uuid_from_time(time.time())

在启动时进行评估并包含一个值作为 uuid。尝试这样的事情:

from uuid import uuid1,uuid4

class Comment(Model):
    photo_id = UUID(primary_key=True)
    comment_id = TimeUUID(primary_key=True, default=uuid1) # second primary key component is a clustering key
    comment = Text()

在这里找到。https://datastax.github.io/python-driver/api/cassandra/cqlengine/query.html

另一个(纯个人的)评论 - 生成明确的 uuid,因为之后经常需要它;)

于 2017-06-20T07:51:58.113 回答