Merge pull request #624 from datastax/538

PYTHON-538: cqlengine deprecate Model.__default_ttl__
This commit is contained in:
Alan Boudreault
2016-07-19 15:27:55 -04:00
committed by GitHub
5 changed files with 82 additions and 10 deletions

View File

@@ -352,7 +352,7 @@ class BaseModel(object):
_table_name = None # used internally to cache a derived table name
def __init__(self, **values):
self._ttl = self.__default_ttl__
self._ttl = None
self._timestamp = None
self._conditional = None
self._batch = None
@@ -691,7 +691,6 @@ class BaseModel(object):
self._set_persisted()
self._ttl = self.__default_ttl__
self._timestamp = None
return self
@@ -738,7 +737,6 @@ class BaseModel(object):
self._set_persisted()
self._ttl = self.__default_ttl__
self._timestamp = None
return self
@@ -794,6 +792,7 @@ class ModelMetaClass(type):
# short circuit __discriminator_value__ inheritance
attrs['__discriminator_value__'] = attrs.get('__discriminator_value__')
# TODO __default__ttl__ should be removed in the next major release
options = attrs.get('__options__') or {}
attrs['__default_ttl__'] = options.get('default_time_to_live')

View File

@@ -299,7 +299,7 @@ class AbstractQuerySet(object):
self._count = None
self._batch = None
self._ttl = getattr(model, '__default_ttl__', None)
self._ttl = None
self._consistency = None
self._timestamp = None
self._if_not_exists = False

View File

@@ -32,8 +32,10 @@ Model
.. autoattribute:: __keyspace__
.. _ttl-change:
.. autoattribute:: __default_ttl__
.. attribute:: __default_ttl__
:annotation: = None
Will be deprecated in release 4.0. You can set the default ttl by configuring the table ``__options__``. See :ref:`ttl-change` for more details.
.. autoattribute:: __discriminator_value__

View File

@@ -343,6 +343,42 @@ None means no timeout.
Setting the timeout on the model is meaningless and will raise an AssertionError.
.. _ttl-change:
Default TTL and Per Query TTL
=============================
Model default TTL now relies on the *default_time_to_live* feature, introduced in Cassandra 2.0. It is not handled anymore in the CQLEngine Model (cassandra-driver >=3.6). You can set the default TTL of a table like this:
Example:
.. code-block:: python
class User(Model):
__options__ = {'default_time_to_live': 20}
user_id = columns.UUID(primary_key=True)
...
You can set TTL per-query if needed. Here are a some examples:
Example:
.. code-block:: python
class User(Model):
__options__ = {'default_time_to_live': 20}
user_id = columns.UUID(primary_key=True)
...
user = User.objects.create(user_id=1) # Default TTL 20 will be set automatically on the server
user.ttl(30).update(age=21) # Update the TTL to 30
User.objects.ttl(10).create(user_id=1) # TTL 10
User(user_id=1, age=21).ttl(10).save() # TTL 10
Named Tables
===================

View File

@@ -18,6 +18,7 @@ try:
except ImportError:
import unittest # noqa
from cassandra import InvalidRequest
from cassandra.cqlengine.management import sync_table, drop_table
from tests.integration.cqlengine.base import BaseCassEngTestCase
from cassandra.cqlengine.models import Model
@@ -158,6 +159,16 @@ class TTLBlindUpdateTest(BaseTTLTest):
@unittest.skipIf(CASSANDRA_VERSION < '2.0', "default_time_to_Live was introduce in C* 2.0, currently running {0}".format(CASSANDRA_VERSION))
class TTLDefaultTest(BaseDefaultTTLTest):
def get_default_ttl(self, table_name):
session = get_session()
try:
default_ttl = session.execute("SELECT default_time_to_live FROM system_schema.tables "
"WHERE keyspace_name = 'cqlengine_test' AND table_name = '{0}'".format(table_name))
except InvalidRequest:
default_ttl = session.execute("SELECT default_time_to_live FROM system.schema_columnfamilies "
"WHERE keyspace_name = 'cqlengine_test' AND columnfamily_name = '{0}'".format(table_name))
return default_ttl[0]['default_time_to_live']
def test_default_ttl_not_set(self):
session = get_session()
@@ -166,6 +177,9 @@ class TTLDefaultTest(BaseDefaultTTLTest):
self.assertIsNone(o._ttl)
default_ttl = self.get_default_ttl('test_ttlmodel')
self.assertEqual(default_ttl, 0)
with mock.patch.object(session, 'execute') as m:
TestTTLModel.objects(id=tid).update(text="aligators")
@@ -174,23 +188,44 @@ class TTLDefaultTest(BaseDefaultTTLTest):
def test_default_ttl_set(self):
session = get_session()
o = TestDefaultTTLModel.create(text="some text on ttl")
tid = o.id
self.assertEqual(o._ttl, TestDefaultTTLModel.__default_ttl__)
# Should not be set, it's handled by Cassandra
self.assertIsNone(o._ttl)
default_ttl = self.get_default_ttl('test_default_ttlmodel')
self.assertEqual(default_ttl, 20)
with mock.patch.object(session, 'execute') as m:
TestDefaultTTLModel.objects(id=tid).update(text="aligators expired")
TestTTLModel.objects(id=tid).update(text="aligators expired")
# Should not be set either
query = m.call_args[0][0].query_string
self.assertIn("USING TTL", query)
self.assertNotIn("USING TTL", query)
def test_default_ttl_modify(self):
session = get_session()
default_ttl = self.get_default_ttl('test_default_ttlmodel')
self.assertEqual(default_ttl, 20)
TestDefaultTTLModel.__options__ = {'default_time_to_live': 10}
sync_table(TestDefaultTTLModel)
default_ttl = self.get_default_ttl('test_default_ttlmodel')
self.assertEqual(default_ttl, 10)
# Restore default TTL
TestDefaultTTLModel.__options__ = {'default_time_to_live': 20}
sync_table(TestDefaultTTLModel)
def test_override_default_ttl(self):
session = get_session()
o = TestDefaultTTLModel.create(text="some text on ttl")
tid = o.id
self.assertEqual(o._ttl, TestDefaultTTLModel.__default_ttl__)
o.ttl(3600)
self.assertEqual(o._ttl, 3600)