I definiert ein einfaches Dokument, wie folgt aus:Stringfield ist als eindeutig definiert, aber Duplikate gespeichert werden stillschweigend
class Company(Document):
screen_name = StringField(max_length=100, required=True, unique=True)
official_name = StringField(required=False)
meta = {
'indexes': [{'fields': 'screen_name', 'unique': True}]
}
aber wenn ich einen Test schreibe
@use_tdb
def test_company3():
""" test company2 """
company = Company(screen_name='asdasd')
company.save()
company = Company(screen_name='asdasd')
with nt.assert_raises(OperationError):
company.save()
pprint([(x.id, x.screen_name,) for x in Company.objects.all()])
Es spart tatsächlich von ihnen beide . Und ich sehe in der Ausgabe:
[(ObjectId('4f719f915c121a21ad000003'), u'asdasd'),
(ObjectId('4f719f915c121a21ad000004'), u'asdasd')]
Irgendwelche Ideen, was ich falsch gemacht habe?
Danke
Danke, @Ankhaa, es funktioniert! Aber ich bin ein bisschen verwirrt. Bei jedem Test hatte ich bereits meinen use_tdb-Dekorator, der alle Sammlungen (außer 'system.indexes') vor und nach jedem Test löscht. Aber das hat nicht geholfen. Und selbst wenn ich die Testdb manuell von der Mongo-Shell löschte, blieb das Problem bestehen. Ich kann es nicht bekommen! db.dropDatabase() entfernt db nicht dauerhaft und beim nächsten Testlauf wählt mongodb alte Indizes aus? –
Ja. Alte Indizes sind kompliziert und verwirrend. Hast du Mongoengine Tests gesehen? Der erste Befehl test start ist drop_collection. Das ist nur für Mongoengine und Mongodb verständlich. nicht in Produktion verwenden :). – Ankhaa
Yup, hab es! Und ich habe eine andere Frage. Gibt es eine elegante Möglichkeit, Indizes für bereits vorhandene Auflistung (in der Entwicklungs- oder Produktions-DB) mit Ausnahme von QuerySet._reset_already_indexed (document = Company) neu zu erstellen? –