remove db.session.execute and use simple ORM statements - less efficient, but only really deleting a small amount anyway

This commit is contained in:
2023-09-26 12:10:09 +10:00
parent 91877ded3a
commit ffe6c309b6

View File

@@ -3,7 +3,7 @@ from flask_wtf import FlaskForm
from flask import request, render_template, redirect, url_for, make_response, jsonify from flask import request, render_template, redirect, url_for, make_response, jsonify
from main import db, app, ma from main import db, app, ma
from settings import Settings, AIModel from settings import Settings, AIModel
from sqlalchemy import Sequence from sqlalchemy import Sequence, func
from sqlalchemy.exc import SQLAlchemyError from sqlalchemy.exc import SQLAlchemyError
from flask_login import login_required, current_user from flask_login import login_required, current_user
from werkzeug.utils import secure_filename from werkzeug.utils import secure_filename
@@ -143,15 +143,14 @@ def TempRefimgFile( data, tag ):
@login_required @login_required
def persons(): def persons():
persons = Person.query.order_by(Person.tag).all() persons = Person.query.order_by(Person.tag).all()
# get the num matches for each person too, and allow link for it
stats = list( db.session.execute( "select p.tag, count(f.id) from person p, face f, face_file_link ffl, face_refimg_link frl, person_refimg_link prl where p.id = prl.person_id and prl.refimg_id = frl.refimg_id and frl.face_id = ffl.face_id and ffl.face_id = f.id group by p.tag" ) )
for p in persons: for p in persons:
if not p.refimg: if not p.refimg:
continue continue
for s in stats: # okay see how many faces match this person
if p.tag == s[0]: stat=Person.query.filter(Person.id==p.id).join(PersonRefimgLink).join(Refimg).join(FaceRefimgLink).with_entities( func.count( Person.tag ) ).group_by( Person.tag ).first()
p.num_matches = s[1]; if stat:
break p.num_matches=stat[0]
return render_template("persons.html", persons=persons) return render_template("persons.html", persons=persons)
@@ -201,10 +200,13 @@ def person(id):
person = Person.query.get(id) person = Person.query.get(id)
if 'delete' in request.form: if 'delete' in request.form:
SetFELog( f"Successfully deleted Person: ({person.tag})" ) SetFELog( f"Successfully deleted Person: ({person.tag})" )
# do linkages by hand, or one day replace with delete cascade in the DB defintions
db.session.execute( f"delete from face_refimg_link frl where refimg_id in ( select refimg_id from person_refimg_link where person_id = {id} )" ) # delete refimgs that are associated with this person (one-by-one), not super efficient
db.session.execute( f"delete from person_refimg_link where person_id = {id}" ) # but simple/clearer than cascades for now
db.session.execute( f"delete from refimg where id not in ( select refimg_id from person_refimg_link )" ) for ref in person.refimg:
FaceRefimgLink.query.filter(FaceRefimgLink.refimg_id==ref.id).delete()
PersonRefimgLink.query.filter(PersonRefimgLink.refimg_id==ref.id).delete()
Refimg.query.filter(Refimg.id==ref.id).delete()
# now can delete the person entry with no foreign key data left # now can delete the person entry with no foreign key data left
Person.query.filter(Person.id==id).delete() Person.query.filter(Person.id==id).delete()