@@ -3,7 +3,7 @@ cqlengine
|
||||
|
||||
cqlengine is a Cassandra CQL 3 Object Mapper for Python
|
||||
|
||||
**Users of versions < 0.4, please read this post: [Breaking Changes](https://groups.google.com/forum/?fromgroups#!topic/cqlengine-users/erkSNe1JwuU)**
|
||||
**Users of versions < 0.16, the default keyspace 'cqlengine' has been removed. Please read this before upgrading:** [Breaking Changes](https://cqlengine.readthedocs.org/en/latest/topics/models.html#keyspace-change)
|
||||
|
||||
[Documentation](https://cqlengine.readthedocs.org/en/latest/)
|
||||
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
from collections import OrderedDict
|
||||
import re
|
||||
import warnings
|
||||
|
||||
from cqlengine import columns
|
||||
from cqlengine.exceptions import ModelException, CQLEngineException, ValidationError
|
||||
from cqlengine.query import ModelQuerySet, DMLQuery, AbstractQueryableColumn
|
||||
@@ -13,6 +15,9 @@ class PolyMorphicModelException(ModelException): pass
|
||||
|
||||
DEFAULT_KEYSPACE = None
|
||||
|
||||
class UndefinedKeyspaceWarning(Warning):
|
||||
pass
|
||||
|
||||
|
||||
class hybrid_classmethod(object):
|
||||
"""
|
||||
@@ -756,6 +761,17 @@ class ModelMetaClass(type):
|
||||
|
||||
#create the class and add a QuerySet to it
|
||||
klass = super(ModelMetaClass, cls).__new__(cls, name, bases, attrs)
|
||||
|
||||
if not klass.__abstract__ and klass.__keyspace__ is None:
|
||||
warnings.warn(
|
||||
"No keyspace defined on {}.{}\n"
|
||||
" The default keyspace 'cqlengine' was removed in 0.16.\n"
|
||||
" Please define a keyspace on the '__keyspace__' model class attribute\n"
|
||||
" or set a default keyspace with management.setup function\n"
|
||||
.format(klass.__module__, klass.__name__),
|
||||
UndefinedKeyspaceWarning
|
||||
)
|
||||
|
||||
return klass
|
||||
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ from cqlengine.tests.base import BaseCassEngTestCase
|
||||
|
||||
|
||||
class TestSetModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
|
||||
partition = columns.UUID(primary_key=True, default=uuid4)
|
||||
int_set = columns.Set(columns.Integer, required=False)
|
||||
@@ -161,6 +162,7 @@ class TestSetColumn(BaseCassEngTestCase):
|
||||
|
||||
|
||||
class TestListModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
|
||||
partition = columns.UUID(primary_key=True, default=uuid4)
|
||||
int_list = columns.List(columns.Integer, required=False)
|
||||
@@ -306,6 +308,7 @@ class TestListColumn(BaseCassEngTestCase):
|
||||
assert m3.int_list == []
|
||||
|
||||
class TestMapModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
|
||||
partition = columns.UUID(primary_key=True, default=uuid4)
|
||||
int_map = columns.Map(columns.Integer, columns.UUID, required=False)
|
||||
@@ -505,6 +508,7 @@ class TestMapColumn(BaseCassEngTestCase):
|
||||
|
||||
|
||||
class TestCamelMapModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
|
||||
partition = columns.UUID(primary_key=True, default=uuid4)
|
||||
camelMap = columns.Map(columns.Text, columns.Integer, required=False)
|
||||
|
||||
@@ -8,6 +8,7 @@ from cqlengine.tests.base import BaseCassEngTestCase
|
||||
|
||||
|
||||
class TestCounterModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
partition = columns.UUID(primary_key=True, default=uuid4)
|
||||
cluster = columns.UUID(primary_key=True, default=uuid4)
|
||||
counter = columns.Counter()
|
||||
|
||||
@@ -32,6 +32,7 @@ import sys
|
||||
|
||||
class TestDatetime(BaseCassEngTestCase):
|
||||
class DatetimeTest(Model):
|
||||
__keyspace__ = 'test'
|
||||
test_id = Integer(primary_key=True)
|
||||
created_at = DateTime()
|
||||
|
||||
@@ -80,6 +81,7 @@ class TestDatetime(BaseCassEngTestCase):
|
||||
|
||||
class TestBoolDefault(BaseCassEngTestCase):
|
||||
class BoolDefaultValueTest(Model):
|
||||
__keyspace__ = 'test'
|
||||
test_id = Integer(primary_key=True)
|
||||
stuff = Boolean(default=True)
|
||||
|
||||
@@ -98,6 +100,7 @@ class TestBoolDefault(BaseCassEngTestCase):
|
||||
|
||||
class TestVarInt(BaseCassEngTestCase):
|
||||
class VarIntTest(Model):
|
||||
__keyspace__ = 'test'
|
||||
test_id = Integer(primary_key=True)
|
||||
bignum = VarInt(primary_key=True)
|
||||
|
||||
@@ -120,6 +123,7 @@ class TestVarInt(BaseCassEngTestCase):
|
||||
|
||||
class TestDate(BaseCassEngTestCase):
|
||||
class DateTest(Model):
|
||||
__keyspace__ = 'test'
|
||||
test_id = Integer(primary_key=True)
|
||||
created_at = Date()
|
||||
|
||||
@@ -158,6 +162,7 @@ class TestDate(BaseCassEngTestCase):
|
||||
|
||||
class TestDecimal(BaseCassEngTestCase):
|
||||
class DecimalTest(Model):
|
||||
__keyspace__ = 'test'
|
||||
test_id = Integer(primary_key=True)
|
||||
dec_val = Decimal()
|
||||
|
||||
@@ -182,6 +187,7 @@ class TestDecimal(BaseCassEngTestCase):
|
||||
|
||||
class TestUUID(BaseCassEngTestCase):
|
||||
class UUIDTest(Model):
|
||||
__keyspace__ = 'test'
|
||||
test_id = Integer(primary_key=True)
|
||||
a_uuid = UUID(default=uuid4())
|
||||
|
||||
@@ -209,6 +215,7 @@ class TestUUID(BaseCassEngTestCase):
|
||||
|
||||
class TestTimeUUID(BaseCassEngTestCase):
|
||||
class TimeUUIDTest(Model):
|
||||
__keyspace__ = 'test'
|
||||
test_id = Integer(primary_key=True)
|
||||
timeuuid = TimeUUID(default=uuid1())
|
||||
|
||||
@@ -234,6 +241,7 @@ class TestTimeUUID(BaseCassEngTestCase):
|
||||
|
||||
class TestInteger(BaseCassEngTestCase):
|
||||
class IntegerTest(Model):
|
||||
__keyspace__ = 'test'
|
||||
test_id = UUID(primary_key=True, default=lambda:uuid4())
|
||||
value = Integer(default=0, required=True)
|
||||
|
||||
@@ -244,6 +252,7 @@ class TestInteger(BaseCassEngTestCase):
|
||||
|
||||
class TestBigInt(BaseCassEngTestCase):
|
||||
class BigIntTest(Model):
|
||||
__keyspace__ = 'test'
|
||||
test_id = UUID(primary_key=True, default=lambda:uuid4())
|
||||
value = BigInt(default=0, required=True)
|
||||
|
||||
@@ -301,6 +310,7 @@ class TestText(BaseCassEngTestCase):
|
||||
|
||||
class TestExtraFieldsRaiseException(BaseCassEngTestCase):
|
||||
class TestModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
id = UUID(primary_key=True, default=uuid4)
|
||||
|
||||
def test_extra_field(self):
|
||||
@@ -309,6 +319,7 @@ class TestExtraFieldsRaiseException(BaseCassEngTestCase):
|
||||
|
||||
class TestPythonDoesntDieWhenExtraFieldIsInCassandra(BaseCassEngTestCase):
|
||||
class TestModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
__table_name__ = 'alter_doesnt_break_running_app'
|
||||
id = UUID(primary_key=True, default=uuid4)
|
||||
|
||||
|
||||
@@ -40,6 +40,7 @@ class BaseColumnIOTest(BaseCassEngTestCase):
|
||||
|
||||
# create a table with the given column
|
||||
class IOTestModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
table_name = cls.column.db_type + "_io_test_model_{}".format(uuid4().hex[:8])
|
||||
pkey = cls.column(primary_key=True)
|
||||
data = cls.column()
|
||||
|
||||
@@ -9,6 +9,7 @@ from cqlengine.tests.base import BaseCassEngTestCase
|
||||
|
||||
|
||||
class CompactionModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
__compaction__ = None
|
||||
cid = columns.UUID(primary_key=True)
|
||||
name = columns.Text()
|
||||
@@ -73,6 +74,7 @@ class LeveledCompactionTest(BaseCompactionTest):
|
||||
|
||||
|
||||
class LeveledcompactionTestTable(Model):
|
||||
__keyspace__ = 'test'
|
||||
__compaction__ = LeveledCompactionStrategy
|
||||
__compaction_sstable_size_in_mb__ = 64
|
||||
|
||||
@@ -94,6 +96,7 @@ class AlterTableTest(BaseCassEngTestCase):
|
||||
from cqlengine.management import update_compaction
|
||||
|
||||
class LeveledCompactionChangesDetectionTest(Model):
|
||||
__keyspace__ = 'test'
|
||||
__compaction__ = LeveledCompactionStrategy
|
||||
__compaction_sstable_size_in_mb__ = 160
|
||||
__compaction_tombstone_threshold__ = 0.125
|
||||
@@ -110,6 +113,7 @@ class AlterTableTest(BaseCassEngTestCase):
|
||||
from cqlengine.management import update_compaction
|
||||
|
||||
class SizeTieredCompactionChangesDetectionTest(Model):
|
||||
__keyspace__ = 'test'
|
||||
__compaction__ = SizeTieredCompactionStrategy
|
||||
__compaction_bucket_high__ = 20
|
||||
__compaction_bucket_low__ = 10
|
||||
@@ -142,6 +146,7 @@ class AlterTableTest(BaseCassEngTestCase):
|
||||
def test_alter_options(self):
|
||||
|
||||
class AlterTable(Model):
|
||||
__keyspace__ = 'test'
|
||||
__compaction__ = LeveledCompactionStrategy
|
||||
__compaction_sstable_size_in_mb__ = 64
|
||||
|
||||
@@ -158,6 +163,7 @@ class AlterTableTest(BaseCassEngTestCase):
|
||||
class EmptyCompactionTest(BaseCassEngTestCase):
|
||||
def test_empty_compaction(self):
|
||||
class EmptyCompactionModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
__compaction__ = None
|
||||
cid = columns.UUID(primary_key=True)
|
||||
name = columns.Text()
|
||||
@@ -167,12 +173,14 @@ class EmptyCompactionTest(BaseCassEngTestCase):
|
||||
|
||||
|
||||
class CompactionLeveledStrategyModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
__compaction__ = LeveledCompactionStrategy
|
||||
cid = columns.UUID(primary_key=True)
|
||||
name = columns.Text()
|
||||
|
||||
|
||||
class CompactionSizeTieredModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
__compaction__ = SizeTieredCompactionStrategy
|
||||
cid = columns.UUID(primary_key=True)
|
||||
name = columns.Text()
|
||||
@@ -183,6 +191,7 @@ class OptionsTest(BaseCassEngTestCase):
|
||||
|
||||
def test_all_size_tiered_options(self):
|
||||
class AllSizeTieredOptionsModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
__compaction__ = SizeTieredCompactionStrategy
|
||||
__compaction_bucket_low__ = .3
|
||||
__compaction_bucket_high__ = 2
|
||||
@@ -211,6 +220,7 @@ class OptionsTest(BaseCassEngTestCase):
|
||||
def test_all_leveled_options(self):
|
||||
|
||||
class AllLeveledOptionsModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
__compaction__ = LeveledCompactionStrategy
|
||||
__compaction_sstable_size_in_mb__ = 64
|
||||
|
||||
|
||||
@@ -27,16 +27,19 @@ class DeleteTableTest(BaseCassEngTestCase):
|
||||
drop_table(TestModel)
|
||||
|
||||
class LowercaseKeyModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
first_key = columns.Integer(primary_key=True)
|
||||
second_key = columns.Integer(primary_key=True)
|
||||
some_data = columns.Text()
|
||||
|
||||
class CapitalizedKeyModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
firstKey = columns.Integer(primary_key=True)
|
||||
secondKey = columns.Integer(primary_key=True)
|
||||
someData = columns.Text()
|
||||
|
||||
class PrimaryKeysOnlyModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
__compaction__ = LeveledCompactionStrategy
|
||||
|
||||
first_ey = columns.Integer(primary_key=True)
|
||||
@@ -55,12 +58,14 @@ class CapitalizedKeyTest(BaseCassEngTestCase):
|
||||
|
||||
|
||||
class FirstModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
__table_name__ = 'first_model'
|
||||
first_key = columns.UUID(primary_key=True)
|
||||
second_key = columns.UUID()
|
||||
third_key = columns.Text()
|
||||
|
||||
class SecondModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
__table_name__ = 'first_model'
|
||||
first_key = columns.UUID(primary_key=True)
|
||||
second_key = columns.UUID()
|
||||
@@ -68,6 +73,7 @@ class SecondModel(Model):
|
||||
fourth_key = columns.Text()
|
||||
|
||||
class ThirdModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
__table_name__ = 'first_model'
|
||||
first_key = columns.UUID(primary_key=True)
|
||||
second_key = columns.UUID()
|
||||
@@ -76,6 +82,7 @@ class ThirdModel(Model):
|
||||
blah = columns.Map(columns.Text, columns.Text)
|
||||
|
||||
class FourthModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
__table_name__ = 'first_model'
|
||||
first_key = columns.UUID(primary_key=True)
|
||||
second_key = columns.UUID()
|
||||
@@ -109,6 +116,7 @@ class AddColumnTest(BaseCassEngTestCase):
|
||||
|
||||
|
||||
class ModelWithTableProperties(Model):
|
||||
__keyspace__ = 'test'
|
||||
# Set random table properties
|
||||
__bloom_filter_fp_chance__ = 0.76328
|
||||
__caching__ = CACHING_ALL
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
from uuid import uuid4
|
||||
import warnings
|
||||
from cqlengine.query import QueryException, ModelQuerySet, DMLQuery
|
||||
from cqlengine.tests.base import BaseCassEngTestCase
|
||||
|
||||
from cqlengine.exceptions import ModelException, CQLEngineException
|
||||
from cqlengine.models import Model, ModelDefinitionException, ColumnQueryEvaluator
|
||||
from cqlengine.models import Model, ModelDefinitionException, ColumnQueryEvaluator, UndefinedKeyspaceWarning
|
||||
from cqlengine import columns
|
||||
import cqlengine
|
||||
|
||||
@@ -19,6 +20,7 @@ class TestModelClassFunction(BaseCassEngTestCase):
|
||||
"""
|
||||
|
||||
class TestModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
id = columns.UUID(primary_key=True, default=lambda:uuid4())
|
||||
text = columns.Text()
|
||||
|
||||
@@ -40,6 +42,7 @@ class TestModelClassFunction(BaseCassEngTestCase):
|
||||
-the db_map allows columns
|
||||
"""
|
||||
class WildDBNames(Model):
|
||||
__keyspace__ = 'test'
|
||||
id = columns.UUID(primary_key=True, default=lambda:uuid4())
|
||||
content = columns.Text(db_field='words_and_whatnot')
|
||||
numbers = columns.Integer(db_field='integers_etc')
|
||||
@@ -64,6 +67,7 @@ class TestModelClassFunction(BaseCassEngTestCase):
|
||||
"""
|
||||
|
||||
class Stuff(Model):
|
||||
__keyspace__ = 'test'
|
||||
id = columns.UUID(primary_key=True, default=lambda:uuid4())
|
||||
words = columns.Text()
|
||||
content = columns.Text()
|
||||
@@ -74,6 +78,7 @@ class TestModelClassFunction(BaseCassEngTestCase):
|
||||
def test_exception_raised_when_creating_class_without_pk(self):
|
||||
with self.assertRaises(ModelDefinitionException):
|
||||
class TestModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
count = columns.Integer()
|
||||
text = columns.Text(required=False)
|
||||
|
||||
@@ -83,6 +88,7 @@ class TestModelClassFunction(BaseCassEngTestCase):
|
||||
Tests that instance value managers are isolated from other instances
|
||||
"""
|
||||
class Stuff(Model):
|
||||
__keyspace__ = 'test'
|
||||
id = columns.UUID(primary_key=True, default=lambda:uuid4())
|
||||
num = columns.Integer()
|
||||
|
||||
@@ -98,6 +104,7 @@ class TestModelClassFunction(BaseCassEngTestCase):
|
||||
Tests that fields defined on the super class are inherited properly
|
||||
"""
|
||||
class TestModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
id = columns.UUID(primary_key=True, default=lambda:uuid4())
|
||||
text = columns.Text()
|
||||
|
||||
@@ -110,6 +117,7 @@ class TestModelClassFunction(BaseCassEngTestCase):
|
||||
def test_column_family_name_generation(self):
|
||||
""" Tests that auto column family name generation works as expected """
|
||||
class TestModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
id = columns.UUID(primary_key=True, default=lambda:uuid4())
|
||||
text = columns.Text()
|
||||
|
||||
@@ -145,6 +153,7 @@ class TestModelClassFunction(BaseCassEngTestCase):
|
||||
Test compound partition key definition
|
||||
"""
|
||||
class ModelWithPartitionKeys(cqlengine.Model):
|
||||
__keyspace__ = 'test'
|
||||
id = columns.UUID(primary_key=True, default=lambda:uuid4())
|
||||
c1 = cqlengine.Text(primary_key=True)
|
||||
p1 = cqlengine.Text(partition_key=True)
|
||||
@@ -166,6 +175,7 @@ class TestModelClassFunction(BaseCassEngTestCase):
|
||||
def test_del_attribute_is_assigned_properly(self):
|
||||
""" Tests that columns that can be deleted have the del attribute """
|
||||
class DelModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
id = columns.UUID(primary_key=True, default=lambda:uuid4())
|
||||
key = columns.Integer(primary_key=True)
|
||||
data = columns.Integer(required=False)
|
||||
@@ -179,9 +189,11 @@ class TestModelClassFunction(BaseCassEngTestCase):
|
||||
""" Tests that DoesNotExist exceptions are not the same exception between models """
|
||||
|
||||
class Model1(Model):
|
||||
__keyspace__ = 'test'
|
||||
id = columns.UUID(primary_key=True, default=lambda:uuid4())
|
||||
|
||||
class Model2(Model):
|
||||
__keyspace__ = 'test'
|
||||
id = columns.UUID(primary_key=True, default=lambda:uuid4())
|
||||
|
||||
try:
|
||||
@@ -195,6 +207,7 @@ class TestModelClassFunction(BaseCassEngTestCase):
|
||||
def test_does_not_exist_inherits_from_superclass(self):
|
||||
""" Tests that a DoesNotExist exception can be caught by it's parent class DoesNotExist """
|
||||
class Model1(Model):
|
||||
__keyspace__ = 'test'
|
||||
id = columns.UUID(primary_key=True, default=lambda:uuid4())
|
||||
|
||||
class Model2(Model1):
|
||||
@@ -208,6 +221,23 @@ class TestModelClassFunction(BaseCassEngTestCase):
|
||||
except Exception:
|
||||
assert False, "Model2 exception should not be caught by Model1"
|
||||
|
||||
def test_no_keyspace_warning(self):
|
||||
with warnings.catch_warnings(record=True) as warn:
|
||||
class NoKeyspace(Model):
|
||||
key = columns.UUID(primary_key=True)
|
||||
|
||||
self.assertEqual(len(warn), 1)
|
||||
warn_message = warn[0]
|
||||
self.assertEqual(warn_message.category, UndefinedKeyspaceWarning)
|
||||
|
||||
def test_abstract_model_keyspace_warning_is_skipped(self):
|
||||
with warnings.catch_warnings(record=True) as warn:
|
||||
class NoKeyspace(Model):
|
||||
__abstract__ = True
|
||||
key = columns.UUID(primary_key=True)
|
||||
|
||||
self.assertEqual(len(warn), 0)
|
||||
|
||||
class TestManualTableNaming(BaseCassEngTestCase):
|
||||
|
||||
class RenamedTest(cqlengine.Model):
|
||||
@@ -223,12 +253,14 @@ class TestManualTableNaming(BaseCassEngTestCase):
|
||||
|
||||
class AbstractModel(Model):
|
||||
__abstract__ = True
|
||||
__keyspace__ = 'test'
|
||||
|
||||
class ConcreteModel(AbstractModel):
|
||||
pkey = columns.Integer(primary_key=True)
|
||||
data = columns.Integer()
|
||||
|
||||
class AbstractModelWithCol(Model):
|
||||
__keyspace__ = 'test'
|
||||
__abstract__ = True
|
||||
pkey = columns.Integer(primary_key=True)
|
||||
|
||||
@@ -237,6 +269,7 @@ class ConcreteModelWithCol(AbstractModelWithCol):
|
||||
|
||||
class AbstractModelWithFullCols(Model):
|
||||
__abstract__ = True
|
||||
__keyspace__ = 'test'
|
||||
pkey = columns.Integer(primary_key=True)
|
||||
data = columns.Integer()
|
||||
|
||||
@@ -309,6 +342,7 @@ class TestCustomQuerySet(BaseCassEngTestCase):
|
||||
|
||||
class CQModel(Model):
|
||||
__queryset__ = QSet
|
||||
__keyspace__ = 'test'
|
||||
part = columns.UUID(primary_key=True)
|
||||
data = columns.Text()
|
||||
|
||||
@@ -322,6 +356,7 @@ class TestCustomQuerySet(BaseCassEngTestCase):
|
||||
raise self.TestException
|
||||
|
||||
class CDQModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
__dmlquery__ = DMLQ
|
||||
part = columns.UUID(primary_key=True)
|
||||
data = columns.Text()
|
||||
|
||||
@@ -8,6 +8,7 @@ from cqlengine.models import Model
|
||||
from cqlengine import columns
|
||||
|
||||
class TestModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
id = columns.UUID(primary_key=True, default=lambda:uuid4())
|
||||
count = columns.Integer()
|
||||
text = columns.Text(required=False)
|
||||
|
||||
@@ -10,6 +10,7 @@ class TestModel(TestCase):
|
||||
def test_instance_equality(self):
|
||||
""" tests the model equality functionality """
|
||||
class EqualityModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
pk = columns.Integer(primary_key=True)
|
||||
|
||||
m0 = EqualityModel(pk=0)
|
||||
@@ -21,9 +22,11 @@ class TestModel(TestCase):
|
||||
def test_model_equality(self):
|
||||
""" tests the model equality functionality """
|
||||
class EqualityModel0(Model):
|
||||
__keyspace__ = 'test'
|
||||
pk = columns.Integer(primary_key=True)
|
||||
|
||||
class EqualityModel1(Model):
|
||||
__keyspace__ = 'test'
|
||||
kk = columns.Integer(primary_key=True)
|
||||
|
||||
m0 = EqualityModel0(pk=0)
|
||||
@@ -40,6 +43,7 @@ class BuiltInAttributeConflictTest(TestCase):
|
||||
"""should raise exception when model defines column that conflicts with built-in attribute"""
|
||||
with self.assertRaises(ModelDefinitionException):
|
||||
class IllegalTimestampColumnModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
my_primary_key = columns.Integer(primary_key=True)
|
||||
timestamp = columns.BigInt()
|
||||
|
||||
@@ -47,5 +51,6 @@ class BuiltInAttributeConflictTest(TestCase):
|
||||
"""should raise exception when model defines column that conflicts with built-in method"""
|
||||
with self.assertRaises(ModelDefinitionException):
|
||||
class IllegalFilterColumnModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
my_primary_key = columns.Integer(primary_key=True)
|
||||
filter = columns.Text()
|
||||
@@ -11,12 +11,14 @@ from cqlengine.models import Model
|
||||
from cqlengine import columns
|
||||
|
||||
class TestModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
id = columns.UUID(primary_key=True, default=lambda:uuid4())
|
||||
count = columns.Integer()
|
||||
text = columns.Text(required=False)
|
||||
a_bool = columns.Boolean(default=False)
|
||||
|
||||
class TestModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
id = columns.UUID(primary_key=True, default=lambda:uuid4())
|
||||
count = columns.Integer()
|
||||
text = columns.Text(required=False)
|
||||
@@ -115,6 +117,7 @@ class TestModelIO(BaseCassEngTestCase):
|
||||
|
||||
|
||||
class TestMultiKeyModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
partition = columns.Integer(primary_key=True)
|
||||
cluster = columns.Integer(primary_key=True)
|
||||
count = columns.Integer(required=False)
|
||||
@@ -240,6 +243,7 @@ class TestCanUpdate(BaseCassEngTestCase):
|
||||
|
||||
|
||||
class IndexDefinitionModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
key = columns.UUID(primary_key=True)
|
||||
val = columns.Text(index=True)
|
||||
|
||||
@@ -250,6 +254,7 @@ class TestIndexedColumnDefinition(BaseCassEngTestCase):
|
||||
sync_table(IndexDefinitionModel)
|
||||
|
||||
class ReservedWordModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
token = columns.Text(primary_key=True)
|
||||
insert = columns.Integer(index=True)
|
||||
|
||||
@@ -270,6 +275,7 @@ class TestQueryQuoting(BaseCassEngTestCase):
|
||||
|
||||
|
||||
class TestQueryModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
test_id = columns.UUID(primary_key=True, default=uuid4)
|
||||
date = columns.Date(primary_key=True)
|
||||
description = columns.Text()
|
||||
@@ -304,6 +310,7 @@ class TestQuerying(BaseCassEngTestCase):
|
||||
|
||||
def test_none_filter_fails():
|
||||
class NoneFilterModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
pk = columns.Integer(primary_key=True)
|
||||
v = columns.Integer()
|
||||
sync_table(NoneFilterModel)
|
||||
|
||||
@@ -14,6 +14,7 @@ class TestPolymorphicClassConstruction(BaseCassEngTestCase):
|
||||
""" Tests that defining a model with more than one polymorphic key fails """
|
||||
with self.assertRaises(models.ModelDefinitionException):
|
||||
class M(models.Model):
|
||||
__keyspace__ = 'test'
|
||||
partition = columns.Integer(primary_key=True)
|
||||
type1 = columns.Integer(polymorphic_key=True)
|
||||
type2 = columns.Integer(polymorphic_key=True)
|
||||
@@ -21,6 +22,7 @@ class TestPolymorphicClassConstruction(BaseCassEngTestCase):
|
||||
def test_polymorphic_key_inheritance(self):
|
||||
""" Tests that polymorphic_key attribute is not inherited """
|
||||
class Base(models.Model):
|
||||
__keyspace__ = 'test'
|
||||
partition = columns.Integer(primary_key=True)
|
||||
type1 = columns.Integer(polymorphic_key=True)
|
||||
|
||||
@@ -35,6 +37,7 @@ class TestPolymorphicClassConstruction(BaseCassEngTestCase):
|
||||
def test_polymorphic_metaclass(self):
|
||||
""" Tests that the model meta class configures polymorphic models properly """
|
||||
class Base(models.Model):
|
||||
__keyspace__ = 'test'
|
||||
partition = columns.Integer(primary_key=True)
|
||||
type1 = columns.Integer(polymorphic_key=True)
|
||||
|
||||
@@ -55,6 +58,7 @@ class TestPolymorphicClassConstruction(BaseCassEngTestCase):
|
||||
|
||||
def test_table_names_are_inherited_from_poly_base(self):
|
||||
class Base(models.Model):
|
||||
__keyspace__ = 'test'
|
||||
partition = columns.Integer(primary_key=True)
|
||||
type1 = columns.Integer(polymorphic_key=True)
|
||||
|
||||
@@ -66,11 +70,13 @@ class TestPolymorphicClassConstruction(BaseCassEngTestCase):
|
||||
def test_collection_columns_cant_be_polymorphic_keys(self):
|
||||
with self.assertRaises(models.ModelDefinitionException):
|
||||
class Base(models.Model):
|
||||
__keyspace__ = 'test'
|
||||
partition = columns.Integer(primary_key=True)
|
||||
type1 = columns.Set(columns.Integer, polymorphic_key=True)
|
||||
|
||||
|
||||
class PolyBase(models.Model):
|
||||
__keyspace__ = 'test'
|
||||
partition = columns.UUID(primary_key=True, default=uuid.uuid4)
|
||||
row_type = columns.Integer(polymorphic_key=True)
|
||||
|
||||
@@ -137,6 +143,7 @@ class TestPolymorphicModel(BaseCassEngTestCase):
|
||||
|
||||
|
||||
class UnindexedPolyBase(models.Model):
|
||||
__keyspace__ = 'test'
|
||||
partition = columns.UUID(primary_key=True, default=uuid.uuid4)
|
||||
cluster = columns.UUID(primary_key=True, default=uuid.uuid4)
|
||||
row_type = columns.Integer(polymorphic_key=True)
|
||||
@@ -194,6 +201,7 @@ class TestUnindexedPolymorphicQuery(BaseCassEngTestCase):
|
||||
|
||||
|
||||
class IndexedPolyBase(models.Model):
|
||||
__keyspace__ = 'test'
|
||||
partition = columns.UUID(primary_key=True, default=uuid.uuid4)
|
||||
cluster = columns.UUID(primary_key=True, default=uuid.uuid4)
|
||||
row_type = columns.Integer(polymorphic_key=True, index=True)
|
||||
|
||||
@@ -10,6 +10,7 @@ from cqlengine.management import sync_table, drop_table
|
||||
|
||||
|
||||
class TestUpdateModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
partition = columns.UUID(primary_key=True, default=uuid4)
|
||||
cluster = columns.UUID(primary_key=True, default=uuid4)
|
||||
count = columns.Integer(required=False)
|
||||
|
||||
@@ -8,10 +8,12 @@ from cqlengine import columns
|
||||
|
||||
|
||||
class TestModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
id = columns.Integer(primary_key=True)
|
||||
clustering_key = columns.Integer(primary_key=True, clustering_order='desc')
|
||||
|
||||
class TestClusteringComplexModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
id = columns.Integer(primary_key=True)
|
||||
clustering_key = columns.Integer(primary_key=True, clustering_order='desc')
|
||||
some_value = columns.Integer()
|
||||
|
||||
@@ -8,12 +8,14 @@ from cqlengine.query import BatchQuery, DMLQuery
|
||||
from cqlengine.tests.base import BaseCassEngTestCase
|
||||
|
||||
class TestMultiKeyModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
partition = columns.Integer(primary_key=True)
|
||||
cluster = columns.Integer(primary_key=True)
|
||||
count = columns.Integer(required=False)
|
||||
text = columns.Text(required=False)
|
||||
|
||||
class BatchQueryLogModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
# simple k/v table
|
||||
k = columns.Integer(primary_key=True)
|
||||
v = columns.Integer()
|
||||
|
||||
@@ -11,6 +11,7 @@ from cqlengine import columns
|
||||
from cqlengine import query
|
||||
|
||||
class DateTimeQueryTestModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
user = columns.Integer(primary_key=True)
|
||||
day = columns.DateTime(primary_key=True)
|
||||
data = columns.Text()
|
||||
|
||||
@@ -39,6 +39,7 @@ class TestQuerySetOperation(BaseCassEngTestCase):
|
||||
|
||||
|
||||
class TokenTestModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
key = columns.Integer(primary_key=True)
|
||||
val = columns.Integer()
|
||||
|
||||
@@ -74,6 +75,7 @@ class TestTokenFunction(BaseCassEngTestCase):
|
||||
def test_compound_pk_token_function(self):
|
||||
|
||||
class TestModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
p1 = columns.Text(partition_key=True)
|
||||
p2 = columns.Text(partition_key=True)
|
||||
|
||||
|
||||
@@ -39,6 +39,7 @@ class TzOffset(tzinfo):
|
||||
|
||||
|
||||
class TestModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
test_id = columns.Integer(primary_key=True)
|
||||
attempt_id = columns.Integer(primary_key=True)
|
||||
description = columns.Text()
|
||||
@@ -47,6 +48,7 @@ class TestModel(Model):
|
||||
|
||||
|
||||
class IndexedTestModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
test_id = columns.Integer(primary_key=True)
|
||||
attempt_id = columns.Integer(index=True)
|
||||
description = columns.Text()
|
||||
@@ -55,6 +57,7 @@ class IndexedTestModel(Model):
|
||||
|
||||
|
||||
class TestMultiClusteringModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
one = columns.Integer(primary_key=True)
|
||||
two = columns.Integer(primary_key=True)
|
||||
three = columns.Integer(primary_key=True)
|
||||
@@ -373,6 +376,7 @@ class TestQuerySetCountSelectionAndIteration(BaseQuerySetUsage):
|
||||
|
||||
def test_non_quality_filtering():
|
||||
class NonEqualityFilteringModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
example_id = columns.UUID(primary_key=True, default=uuid.uuid4)
|
||||
sequence_id = columns.Integer(primary_key=True) # sequence_id is a clustering key
|
||||
example_type = columns.Integer(index=True)
|
||||
@@ -542,6 +546,7 @@ class TestQuerySetConnectionHandling(BaseQuerySetUsage):
|
||||
|
||||
|
||||
class TimeUUIDQueryModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
partition = columns.UUID(primary_key=True)
|
||||
time = columns.TimeUUID(primary_key=True)
|
||||
data = columns.Text(required=False)
|
||||
|
||||
@@ -9,6 +9,7 @@ from cqlengine import columns
|
||||
|
||||
|
||||
class TestQueryUpdateModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
partition = columns.UUID(primary_key=True, default=uuid4)
|
||||
cluster = columns.Integer(primary_key=True)
|
||||
count = columns.Integer(required=False)
|
||||
|
||||
@@ -11,6 +11,7 @@ from cqlengine.query import BatchQuery
|
||||
from cqlengine.tests.base import BaseCassEngTestCase
|
||||
|
||||
class TestMultiKeyModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
partition = columns.Integer(primary_key=True)
|
||||
cluster = columns.Integer(primary_key=True)
|
||||
count = columns.Integer(required=False)
|
||||
|
||||
@@ -7,6 +7,7 @@ import mock
|
||||
from cqlengine import ALL, BatchQuery
|
||||
|
||||
class TestConsistencyModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
id = columns.UUID(primary_key=True, default=lambda:uuid4())
|
||||
count = columns.Integer()
|
||||
text = columns.Text(required=False)
|
||||
|
||||
@@ -8,6 +8,7 @@ import resource
|
||||
import gc
|
||||
|
||||
class LoadTest(Model):
|
||||
__keyspace__ = 'test'
|
||||
k = Integer(primary_key=True)
|
||||
v = Integer()
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@ from cqlengine.tests.base import BaseCassEngTestCase
|
||||
|
||||
|
||||
class TestTimestampModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
id = columns.UUID(primary_key=True, default=lambda:uuid4())
|
||||
count = columns.Integer()
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@ from cqlengine.connection import get_session
|
||||
|
||||
|
||||
class TestTTLModel(Model):
|
||||
__keyspace__ = 'test'
|
||||
id = columns.UUID(primary_key=True, default=lambda:uuid4())
|
||||
count = columns.Integer()
|
||||
text = columns.Text(required=False)
|
||||
|
||||
@@ -5,9 +5,7 @@
|
||||
cqlengine documentation
|
||||
=======================
|
||||
|
||||
**Users of versions < 0.4, please read this post before upgrading:** `Breaking Changes`_
|
||||
|
||||
.. _Breaking Changes: https://groups.google.com/forum/?fromgroups#!topic/cqlengine-users/erkSNe1JwuU
|
||||
**Users of versions < 0.16, the default keyspace 'cqlengine' has been removed. Please read this before upgrading:** :ref:`Breaking Changes <keyspace-change>`
|
||||
|
||||
cqlengine is a Cassandra CQL 3 Object Mapper for Python
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Frequently Asked Questions
|
||||
==========================
|
||||
|
||||
Q: Why does calling my Model(field=blah, field2=blah2) not work?
|
||||
Q: Why don't updates work correctly on models instantiated as Model(field=blah, field2=blah2)?
|
||||
-------------------------------------------------------------------
|
||||
|
||||
A: The __init__() of a model is used by cqlengine internally. If you want to create a new row in the database, use create().
|
||||
A: The recommended way to create new rows is with the models .create method. The values passed into a model's init method are interpreted by the model as the values as they were read from a row. This allows the model to "know" which rows have changed since the row was read out of cassandra, and create suitable update statements.
|
||||
@@ -169,9 +169,13 @@ Model Attributes
|
||||
|
||||
*Optional.* Sets the name of the CQL table for this model. If left blank, the table name will be the name of the model, with it's module name as it's prefix. Manually defined table names are not inherited.
|
||||
|
||||
.. _keyspace-change:
|
||||
.. attribute:: Model.__keyspace__
|
||||
|
||||
*Optional.* Sets the name of the keyspace used by this model. Defaults to cqlengine
|
||||
Sets the name of the keyspace used by this model.
|
||||
|
||||
**Prior to cqlengine 0.16, this setting defaulted
|
||||
to 'cqlengine'. As of 0.16, this field needs to be set on all non-abstract models, or their base classes.**
|
||||
|
||||
|
||||
Table Polymorphism
|
||||
|
||||
Reference in New Issue
Block a user