From 94ba8b9c711e3e90bb5ca436b417b00d8e921ca3 Mon Sep 17 00:00:00 2001 From: Julian Rother <julian@cccv.de> Date: Mon, 18 Mar 2024 17:52:45 +0100 Subject: [PATCH] Fix ORM cartesian product warnings SQLAlchemy v1.4 (Debian Bookworm) annoyingly warns about select statements that result in a cartesion product of multiple tables. We actually want cartesion products in all affected cases, so we change "SELECT FROM a,b" to the equivalent "SELECT FROM a JOIN b ON TRUE". See https://docs.sqlalchemy.org/en/14/changelog/migration_14.html --- uffd/migrations/versions/f2eb2c52a61f_add_serviceuser.py | 5 ++++- uffd/models/service.py | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/uffd/migrations/versions/f2eb2c52a61f_add_serviceuser.py b/uffd/migrations/versions/f2eb2c52a61f_add_serviceuser.py index 2440efa2..2ee336c5 100644 --- a/uffd/migrations/versions/f2eb2c52a61f_add_serviceuser.py +++ b/uffd/migrations/versions/f2eb2c52a61f_add_serviceuser.py @@ -23,7 +23,10 @@ def upgrade(): ) service = sa.table('service', sa.column('id')) user = sa.table('user', sa.column('id')) - op.execute(service_user.insert().from_select(['service_id', 'user_id'], sa.select([service.c.id, user.c.id]))) + op.execute(service_user.insert().from_select( + ['service_id', 'user_id'], + sa.select([service.c.id, user.c.id]).select_from(sa.join(service, user, sa.true())) + )) def downgrade(): op.drop_table('service_user') diff --git a/uffd/models/service.py b/uffd/models/service.py index 7aa928d4..1bed5cfc 100644 --- a/uffd/models/service.py +++ b/uffd/models/service.py @@ -178,7 +178,7 @@ def create_service_users(session, flush_context): # pylint: disable=unused-argum return db.session.execute(db.insert(ServiceUser).from_select( ['service_id', 'user_id'], - db.select([Service.id, User.id]).where(db.or_( + db.select([Service.id, User.id]).select_from(db.join(Service, User, db.true())).where(db.or_( Service.id.in_(new_service_ids), User.id.in_(new_user_ids), )) @@ -193,7 +193,7 @@ def create_missing_service_users(): # pylint: disable=no-member db.session.execute(db.insert(ServiceUser).from_select( ['service_id', 'user_id'], - db.select([Service.id, User.id]).where(db.not_( + db.select([Service.id, User.id]).select_from(db.join(Service, User, db.true())).where(db.not_( ServiceUser.query.filter( ServiceUser.service_id == Service.id, ServiceUser.user_id == User.id -- GitLab