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],
)