2013-07-12 1 views
2

Je veux créer une table avec deux primary_key par son modèle django comme ci-dessous:Python/Django: Créer table avec deux primary_key en utilisant le moteur de cql

class UserView(Model): 
    email= columns.Text(primary_key=True) 
    entryLink= columns.Text(primary_key=True) 
    date= columns.Date(default=datetime.date.today()) 

mais quand je veux créer la table comme ci-dessous:

>>> from cqlengine import connection 
>>> from cqlengine.management import create_table 
>>> from MainAPP.models import UserView 
>>> connection.setup(['127.0.0.1:9160']) 
>>> create_table(UserView) 

Je vois cette erreur:

Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "H:\Web-Programming\Python\Project\Prexter\Virtual-Environment\Lib\site-packages\cqlengine\management.py", line 97, in create_table 
execute(qs) 
    File "H:\Web-Programming\Python\Project\Prexter\Virtual-Environment\Lib\site-packages\cqlengine\connection.py", line 172, in execute 
return connection_pool.execute(query, params) 
    File "H:\Web-Programming\Python\Project\Prexter\Virtual-Environment\Lib\site-packages\cqlengine\connection.py", line 164, in execute 
    raise CQLEngineException(unicode(ex)) 
CQLEngineException: Bad Request: Missing CLUSTERING ORDER for column entryLink 

Lorsque je supprime primary_key propriété de entryLink domaine, je n'ai pas d'erreur! mais je veux définir entryLink comme une clé primaire! Quelle est mon erreur?

Répondre

1

Une table de base de données ne peut pas avoir 2 clés primaires. Si vous recherchez une clé primaire composite, Django does not support that yet.

Maintenant, ce que pourrait rechercher est unique=True (une clé candidate).

class UserView(Model): 
    email= columns.Text(primary_key=True) 
    entryLink= columns.Text(unique=True) 
    date= columns.Date(default=datetime.date.today()) 

Vous pouvez également lire this post for a better understanding

+0

Cela est vrai! Mais sachez que ma base de données est cassandra! Dans ce code, mon premier primary_key sera défini comme une partition_key et les autres primary_keys doivent être mes clés de clustering! veuillez lire cette section: [https://cqlengine.readthedocs.org/fr/latest/topics/models.html#column-options](https://cqlengine.readthedocs.org/en/latest/topics/models.html # column-options) –

+0

Je n'achète toujours pas le fait qu'une table doit avoir plusieurs clés 'primary'. Les clés du candidat - OUI, mais la clé «primaire»? Même si Cassandra le supporte, Django ne le fait pas. – karthikr

+1

Je vois 'Dans CQL, il y a 2 types de clés primaires: les clés de partition et les clés de clustering. Comme avec CQL, la première clé primaire est la clé de partition, et toutes les autres sont des clés de clustering, sauf si les clés de partition sont spécifiées manuellement en utilisant partition_key' - Maintenant, django ne le supporterait pas par défaut. Cependant, vous pouvez jeter un oeil aux applications tierces comme 'django-nonrel' et voir comment elle est implémentée ici. – karthikr

2

J'ai trouvé ma réponse! C'est un bug drôle! J'ai un caractère majuscule parmi champ entryLink, et il a causé une erreur considérée! C'est tellement drôle! parce que cela ne s'applique qu'à primary_key! et ce n'est pas vrai dans d'autres domaines !!! primary_keys ne peut pas avoir de caractère en majuscule parmi!

Mon code modifié:

class UserView(Model): 
    email= columns.Text(primary_key=True) 
    link= columns.Text(primary_key = True) 
    date= columns.Date(default=datetime.date.today()) 
Questions connexes