Column 'problem' in table 'system_cockpit_problem' is of a type that is invalid for use as a key column in an index.

Django, Flask, Bottle, WSGI, CGI…
Antworten
gospat83
User
Beiträge: 40
Registriert: Dienstag 21. September 2021, 14:25

Hallo zusammen,

ich habe meine models.py Datei gerade um ein Model erweitert. Bisher lief alles reibungslos, aber nach dem Hinzufügen bekomme ich die im Betreff genannte Fehlermeldung. Ich habe keine Ahnung was das Problem ist und wie ich es löse? Vielleicht kann mir einer von euch hier weiterhelfen. Meine models.py sieht wie folgt aus.

Code: Alles auswählen

from django.db import models

 

class Project(models.Model):

    project_name = models.CharField(max_length=100, blank=True, null=True, unique=True)

    cost_bearer = models.CharField(max_length=6, blank=False, null=False, unique=True)

    created = models.DateTimeField(auto_now_add=True)

    updated = models.DateTimeField(auto_now=True)

 

    def __str__(self):

        return self.cost_bearer

   

class System(models.Model):

    project = models.ForeignKey(Project, on_delete=models.CASCADE)

    system = models.CharField(max_length=4, blank=False, null=False)

    system_name = models.CharField(max_length=100, blank=True, null=True)

    created = models.DateTimeField(auto_now_add=True)

    updated = models.DateTimeField(auto_now=True)

 

    class Meta:

        constraints = [

            models.UniqueConstraint(fields=['project', 'system'], name='unique_system')

        ]

 

    def __str__(self):

        return self.system

   

 

class Status(models.Model):

    project = models.ForeignKey(Project, on_delete=models.CASCADE)

    system = models.ForeignKey(System, on_delete=models.CASCADE)

    COLORS = (

        ('0', 'Rot'),

        ('1', 'Gelb'),

        ('2', 'Grün'),

    )

    status = models.CharField(max_length=4, choices=COLORS, blank=False, null=False, default='Grün')

    created = models.DateTimeField(auto_now_add=True)

    updated = models.DateTimeField(auto_now=True)

 

    class Meta:

        constraints = [

            models.UniqueConstraint(fields=['project', 'system'], name='unique_status')

        ]

 

    def __str__(self):

        return self.status

   

 

class Department(models.Model):

    department_name = models.CharField(max_length=10, blank=False, null=False, unique=True)

    created = models.DateTimeField(auto_now_add=True)

    updated = models.DateTimeField(auto_now=True)

 

    def __str__(self):

        return self.department_name

   

 

class Employee(models.Model):

    department = models.ForeignKey(Department, on_delete=models.SET_NULL, blank=False, null=True)

    employee_name = models.CharField(max_length=100, blank=False, null=False, unique=True)

    created = models.DateTimeField(auto_now_add=True)

    updated = models.DateTimeField(auto_now=True)

 

    def __str__(self):

        return self.employee_name

 

class Responsibility(models.Model):

    project = models.ForeignKey(Project, on_delete=models.CASCADE, blank=False, null=False)

    system = models.ForeignKey(System, on_delete=models.CASCADE, blank=False, null=False)

    department = models.ForeignKey(Department, on_delete=models.SET_NULL, blank=False, null=True)

    employee_name = models.ForeignKey(Employee, on_delete=models.SET_NULL, blank=False, null=True)

    created = models.DateTimeField(auto_now_add=True)

    updated = models.DateTimeField(auto_now=True)

 

    class Meta:

        constraints = [

            models.UniqueConstraint(fields=['project', 'system', 'department', 'employee_name'], name='unique_responsibility')

        ]

 

    def __str__(self):

        return f'{self.project} | {self.system} | {self.department} | {self.employee_name}'

 

class Problem(models.Model):

    project = models.ForeignKey(Project, on_delete=models.CASCADE, blank=False, null=False)

    system = models.ForeignKey(System, on_delete=models.CASCADE, blank=False, null=False)

    department = models.ForeignKey(Department, on_delete=models.SET_NULL, null=True)

    problem = models.TextField(max_length=2000, blank=True, null=True)

    created = models.DateTimeField(auto_now_add=True)

    updated = models.DateTimeField(auto_now=True)

 

    class Meta:

        constraints = [

            models.UniqueConstraint(fields=['project', 'system', 'department', 'problem'], name='unique_problem')

        ]
Viele Grüße
gospat
Benutzeravatar
__blackjack__
User
Beiträge: 13997
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@gospat83: Ich rate jetzt mal, dass die Klasse die hinzugefügt wurde `Problem` ist. Da wird versucht das `problem`-Feld in einem UNIQUE-Constraint zu verwenden, und ich nehme mal an Textfelder gehen da nicht.

Anmerkungen: Attribute bei Klassen und Spalten bei Tabellen beschreiben woraus ein Objekt/ein Datensatz besteht. Das ist komisch bis falsch wenn da noch mal der Klassen-/Tabellenname wiederholt wird, denn das führt zu so Beschreibungen wie „Ein Problem besteht aus einem Projekt, einem System, ·…, und einem Problem.“ Das `problem` sollte wahrscheinlich eher `description` oder so heissen. Das gleiche Problem bei `System.system`.

`employee_name` in `Responsibility` sollte nur `employee` heissen, denn das steht ja nicht für den Namen sondern für den gesamten Angestellten.

Bei allen anderen Feldern die mit `_name` enden gehört der Klassenname nicht noch mal davor. Das ist jeweils einfach nur `name`.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
gospat83
User
Beiträge: 40
Registriert: Dienstag 21. September 2021, 14:25

Danke für deine Anmerkungen, die Spalten werde ich mal anpassen. Aber ich umgehe ich denn mein Problem? Ich möchte halt gewährleisten, dass die Kombination aus Project, System, Department und Problem eindeutig ist. Gibt es da eine andere Möglichkeit?
Benutzeravatar
sparrow
User
Beiträge: 4525
Registriert: Freitag 17. April 2009, 10:28

Kein Textfield verwenden.
Sagt auch die Fehlermeldung.

Ich stelle aber auch mal in Frage, dass dein Vorgehen richtig ist. Einen Freitext als unique zu setzen klingt sehr komisch.
gospat83
User
Beiträge: 40
Registriert: Dienstag 21. September 2021, 14:25

Das Problem ist, dass ich aber genau an der Stelle ein TextField brauche. Dann mache ich es einfach nicht unique, ist dann eben so.
Benutzeravatar
__blackjack__
User
Beiträge: 13997
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Vor allem will man ja, das es dieses Problem nicht mehrfach in der Datenbank gibt, aber das kann man ja gar nicht verhindern, weil es zig Möglichkeiten gibt, das gleiche Problem in (freie) Worte zu fassen.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Antworten