我有代码
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_key
在test.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
方法吗?