Hacktoberfest 2026: die Issues, die Maintainer für den Oktober markiert haben – offen und einsteigerfreundlich. Hacktoberfest-Issues durchsuchen

delete() does nothing when its restriction contains a percent sign

Offen
#1,636 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Maintainer antworten meist innerhalb von 4 Tagen

@dimitri-yatsenko arbeitet bereits daran.

Seit 17.10.2026.

  • #1611 von @dimitri-yatsenko — offen

Bewertung

Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Anfängerfreundlichkeit
78/100
Issue-Typ
Bug
Klarheit
Klar beschrieben
Aktivitätsstatus
Aktiv
Tech-Stack
mysql, postgresql, python
Bereich
database

Rechercherichtung

Start with the cascade implementation around Diagram.cascade() and the restriction handling in restrict(), then trace how conditions are reapplied to the fresh table. Reproduce the % cases with the issue’s Label and Use example. Done means the cascade deletes the matching row and its descendants without changing behavior for ordinary conditions or LIKE patterns, with regression tests covering both database drivers.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

bug

Summary

A delete restricted by a condition that contains % deletes nothing. (Label & "name = '50%'").delete() returns 0 and leaves the row and its descendants in place, and so does a dict restriction such as {"name": "50%"}. dj.Diagram.cascade(seed).counts() reports 0 rows for every table, although len(seed) is 1.

A restriction's conditions are stored as compiled SQL, with every % already escaped as %% for the database driver. The cascade applies the seed's conditions again to a fresh copy of the table through restrict(), which escapes every % a second time. The condition then looks for the literal text 50%% and matches no row.

A LIKE pattern keeps working, because %% and % match the same strings there.

Nothing is deleted that should not be, but the delete silently does nothing.

Reproduction

DataJoint 2.3.4 and master, MySQL 8.0 and PostgreSQL 15:

import datajoint as dj

schema = dj.Schema("scratch_percent")


@schema
class Label(dj.Manual):
    definition = """
    label_id : int32
    ---
    name : varchar(16)
    """


@schema
class Use(dj.Manual):
    definition = """
    -> Label
    use_id : int32
    """


Label.insert([(1, "50%"), (2, "other")])
Use.insert([(1, 1), (2, 1)])

seed = Label & "name = '50%'"
print(len(seed))                               # 1
print(dj.Diagram.cascade(seed).counts())       # 0 rows in each table
print(seed.delete(prompt=False))               # 0; both labels and both uses remain

Workaround

Restrict by the primary keys: (Label & seed.keys()).delete().

Expected behavior

The cascade selects the same rows as the restriction on its own: label 1 and its use.

Vorherrschende Sprache
Python
Sterne
197
Forks
101
Ø Merge
3 T. 8 Std.
Gemergte PRs (30 T.)
28

Entwicklungsumgebung

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus datajoint/datajoint-python

Alle Issues in datajoint/datajoint-python

Ähnliche Issues

Weitere Issues zu Python

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.