Skip to content

Commit 85f32ec

Browse files
committed
cqle: guard against formatting an invalid keyspace in a query
PYTHON-395 Resolves AttributeError when trying to query without a keyspace name, instead raising a CQLEngineException.
1 parent 0262b2d commit 85f32ec

2 files changed

Lines changed: 26 additions & 2 deletions

File tree

cassandra/cqlengine/models.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -480,7 +480,10 @@ def column_family_name(cls, include_keyspace=True):
480480
"""
481481
cf_name = protect_name(cls._raw_column_family_name())
482482
if include_keyspace:
483-
return '{0}.{1}'.format(protect_name(cls._get_keyspace()), cf_name)
483+
keyspace = cls._get_keyspace()
484+
if not keyspace:
485+
raise CQLEngineException("Model keyspace is not set and no default is available. Set model keyspace or setup connection before attempting to generate a query.")
486+
return '{0}.{1}'.format(protect_name(keyspace), cf_name)
484487

485488
return cf_name
486489

tests/integration/cqlengine/model/test_model.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616
except ImportError:
1717
import unittest # noqa
1818

19-
from cassandra.cqlengine import columns
19+
from mock import patch
20+
21+
from cassandra.cqlengine import columns, CQLEngineException
2022
from cassandra.cqlengine.management import sync_table, drop_table, create_keyspace_simple, drop_keyspace
2123
from cassandra.cqlengine.models import Model, ModelDefinitionException
2224

@@ -105,6 +107,25 @@ class table(Model):
105107

106108
drop_keyspace('keyspace')
107109

110+
def test_column_family(self):
111+
class TestModel(Model):
112+
k = columns.Integer(primary_key=True)
113+
114+
from cassandra.cqlengine import models
115+
# no model keyspace uses default
116+
self.assertEqual(TestModel.column_family_name(), "%s.test_model" % (models.DEFAULT_KEYSPACE,))
117+
118+
# model keyspace overrides
119+
TestModel.__keyspace__ = "my_test_keyspace"
120+
self.assertEqual(TestModel.column_family_name(), "%s.test_model" % (TestModel.__keyspace__,))
121+
122+
# neither set should raise CQLEngineException before failing or formatting an invalid name
123+
del TestModel.__keyspace__
124+
with patch('cassandra.cqlengine.models.DEFAULT_KEYSPACE', None):
125+
self.assertRaises(CQLEngineException, TestModel.column_family_name)
126+
# .. but we can still get the bare CF name
127+
self.assertEqual(TestModel.column_family_name(include_keyspace=False), "test_model")
128+
108129

109130
class BuiltInAttributeConflictTest(unittest.TestCase):
110131
"""tests Model definitions that conflict with built-in attributes/methods"""

0 commit comments

Comments
 (0)