Du hast in dem ``if`` ein `ClauseElement` und das wehrt sich, zurecht, dagegen in einen Wahrheitswert umgewandelt zu werden. Was Du da machst ist quasi eine SQL-Abfrage zu erstellen, aber die dann nicht gegen die Datenbank auszuführen, sondern die Abfrage und nicht deren Ergebnis zu fragen ob sie wahr ist oder nicht.
Code: Alles auswählen
In [76]: bool(sa.exists())
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-76-42b5f571bf4c> in <module>
----> 1 bool(sa.exists())
/usr/local/lib/python3.6/dist-packages/sqlalchemy/sql/elements.py in __bool__(self)
485
486 def __bool__(self):
--> 487 raise TypeError("Boolean value of this clause is not defined")
488
489 __nonzero__ = __bool__
TypeError: Boolean value of this clause is not defined
Ich finde das aber auch ein bisschen komisch wie Du die Anfragen erstellst, statt `Session.query()` zu verwenden wenn das ORM-Klassen sind.
Mein ”Lieblingsthema”: Namen. Keine kryptischen Abkürzungen. `res`? Das ist wohl eher `rows`. `newEntry` hält sich nicht an die Namenskonventionen (klein_mit_unterstrichen) und auch hier ist das `entry` etwas generisch. Und man muss das auch gar nicht zwingend an einen Namen binden.
Ungetestet:
Code: Alles auswählen
#
# db ist der Alias des Moduls in welchem sich die ORM Klassen
# befinden, content['name'] kommt aus einer Liste über die iteriert
# wird.
#
rows = (
session.query(db.Software.id)
.filter_by(name=content["name"])
.all()
)
for row in rows:
if (
session.query(db.Status)
.filter_by(software_id=row.id)
.exists()
.scalar()
):
# do this
...
else:
session.add(db.SoftwareStatus(software_id=row.id))
session.commit()
Nachtrag: Wenn man grundsätzlich die Existenz einer Status-ID zu jeder Software-ID prüft und die Status-ID nicht NULL sein kann, dann könnte man auch gleich in der ersten Abfrage einen LEFT OUTER JOIN machen. Ungetestet:
Code: Alles auswählen
for software_id, status_id in (
session.query(db.Software.id, db.Status.id)
.outerjoin(db.Status)
.filter_by(name=content["name"])
.all()
):
if status_id is not None:
# do this
...
else:
session.add(db.SoftwareStatus(software_id=software_id))
session.commit()