You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by ru...@apache.org on 2026/08/05 05:50:18 UTC

(superset) 01/01: fix(models): guard three more backref cascades for SQLAlchemy 2.0

This is an automated email from the ASF dual-hosted git repository.

rusackas pushed a commit to branch fix/cascade-backrefs-sqla2-followup
in repository https://gitbox.apache.org/repos/asf/superset.git

commit f13580d7e2170e2f7f5e0af3cb060c9a4c023b80
Author: Claude Code <no...@anthropic.com>
AuthorDate: Tue Aug 4 22:49:25 2026 -0700

    fix(models): guard three more backref cascades for SQLAlchemy 2.0
    
    SSHTunnel.database, ReportRecipients.report_schedule, and
    ReportExecutionLog.report_schedule were missed by the earlier sweep that
    added cascade_backrefs=False to Query, SavedQuery, SqlaTable, SqlMetric,
    TableColumn, TaggedObject, and User (discussion #40273, step 2) -- same
    reverse-cascade warning, same fix. Locks each in via a pytest.ini
    filterwarnings error line, matching the existing entries for the other
    seven models.
---
 pytest.ini                              |  3 +++
 superset/databases/ssh_tunnel/models.py |  4 ++++
 superset/reports/models.py              | 20 ++++++++++++++++++--
 3 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/pytest.ini b/pytest.ini
index c36cd30a588..0a98c8efc05 100644
--- a/pytest.ini
+++ b/pytest.ini
@@ -30,9 +30,12 @@ filterwarnings =
     always::sqlalchemy.exc.RemovedIn20Warning
     error:Passing a string to Connection.execute\(\) is deprecated:sqlalchemy.exc.RemovedIn20Warning
     error:"Query" object is being merged into a Session:sqlalchemy.exc.RemovedIn20Warning
+    error:"ReportExecutionLog" object is being merged into a Session:sqlalchemy.exc.RemovedIn20Warning
+    error:"ReportRecipients" object is being merged into a Session:sqlalchemy.exc.RemovedIn20Warning
     error:"SavedQuery" object is being merged into a Session:sqlalchemy.exc.RemovedIn20Warning
     error:"SqlaTable" object is being merged into a Session:sqlalchemy.exc.RemovedIn20Warning
     error:"SqlMetric" object is being merged into a Session:sqlalchemy.exc.RemovedIn20Warning
+    error:"SSHTunnel" object is being merged into a Session:sqlalchemy.exc.RemovedIn20Warning
     error:"TableColumn" object is being merged into a Session:sqlalchemy.exc.RemovedIn20Warning
     error:"TaggedObject" object is being merged into a Session:sqlalchemy.exc.RemovedIn20Warning
     error:The autoload parameter is deprecated:sqlalchemy.exc.RemovedIn20Warning
diff --git a/superset/databases/ssh_tunnel/models.py b/superset/databases/ssh_tunnel/models.py
index cb5bc1acd58..85093dbb38e 100644
--- a/superset/databases/ssh_tunnel/models.py
+++ b/superset/databases/ssh_tunnel/models.py
@@ -55,6 +55,10 @@ class SSHTunnel(AuditMixinNullable, ExtraJSONMixin, ImportExportMixin, Model):
             uselist=False,
             cascade="all, delete-orphan",
             lazy="joined",
+            # SQLAlchemy 2.0 behavior: assigning `ssh_tunnel.database` no
+            # longer cascades the SSHTunnel into the Database's session;
+            # callers must add objects to a session explicitly.
+            cascade_backrefs=False,
         ),
         foreign_keys=[database_id],
     )
diff --git a/superset/reports/models.py b/superset/reports/models.py
index 7ec81b0a70d..0e67e254664 100644
--- a/superset/reports/models.py
+++ b/superset/reports/models.py
@@ -388,7 +388,15 @@ class ReportRecipients(Model, AuditMixinNullable):
     )
     report_schedule = relationship(
         ReportSchedule,
-        backref=backref("recipients", cascade="all,delete,delete-orphan"),
+        backref=backref(
+            "recipients",
+            cascade="all,delete,delete-orphan",
+            # SQLAlchemy 2.0 behavior: assigning `recipient.report_schedule`
+            # no longer cascades the ReportRecipients into the
+            # ReportSchedule's session; callers must add objects to a
+            # session explicitly.
+            cascade_backrefs=False,
+        ),
         foreign_keys=[report_schedule_id],
     )
 
@@ -424,7 +432,15 @@ class ReportExecutionLog(Model):  # pylint: disable=too-few-public-methods
     )
     report_schedule = relationship(
         ReportSchedule,
-        backref=backref("logs", cascade="all,delete,delete-orphan"),
+        backref=backref(
+            "logs",
+            cascade="all,delete,delete-orphan",
+            # SQLAlchemy 2.0 behavior: assigning `log.report_schedule` no
+            # longer cascades the ReportExecutionLog into the
+            # ReportSchedule's session; callers must add objects to a
+            # session explicitly.
+            cascade_backrefs=False,
+        ),
         foreign_keys=[report_schedule_id],
     )