0%

Wijzig gegevens veilig · oefening

Wijzig alleen dat voorwerp

De voorafgaande controle bevestigt dat EL-300 de projector is en dat de huidige termijn 2.5 is. De volgende aanroep moet die ene waarde veranderen in 8 en elk ander voorwerp ongemoeid laten:

change_loan_days(connection, "EL-300", 8)

De argumenten na de open verbinding zijn de identificerende inventariscode en de nieuwe termijn. Open catalog_changes.py en zoek de nieuwe functie:

def change_loan_days(connection, asset_tag, loan_days):
    statement = """
        UPDATE items
        SET loan_days = ?
        WHERE asset_tag = ?
    """
    connection.execute(statement, (asset_tag, loan_days))

UPDATE items noemt de tabel die moet veranderen. SET loan_days = ? geeft de eerste placeholder de nieuwe waarde. WHERE asset_tag = ? laat de tweede placeholder de bedoelde rij identificeren. De wijzigingsinstructie bevat haar eigen precieze begrenzing, ook al heeft de aanroeper de rij vooraf bekeken.

In de begintuple staan de twee Python-waarden omgekeerd. Vergelijk de posities voordat je iets wijzigt:

Positie in SQLWaarde van het Python-argument
eerste ?, nieuwe loan_daysloan_days
tweede ?, doel-asset_tagasset_tag

Let erop dat de eerdere controle en deze update twee afzonderlijke instructies zijn. De projector bij de controle zien hielp je beslissen wat je wilde doen, maar beperkt een latere update niet. De UPDATE moet zelf WHERE asset_tag = ? bevatten. Wanneer de aanroep "EL-300" gebruikt, ontvangt de database de instructie ongewijzigd en krijgt ze (8, "EL-300") als waarden: 8 beantwoordt “wat moet veranderen?” en "EL-300" beantwoordt “welke rij?”

Dat onderscheid wordt extra duidelijk bij een ontbrekende code. (8, "NO-404") is nog steeds een geldig paar gebonden waarden, maar de WHERE-voorwaarde vindt niets, dus verandert er geen rij. De andere luidspreker wordt geen vervangend doel. Een precieze voorwaarde betekent “deze rij als die bestaat”, niet “een soortgelijke rij”.

Verander de laatste tuple in (loan_days, asset_tag) en druk op Run.

before EL-300
(5, 'EL-300', 'Projector', 'electronics', 2.5)
change_loan_days(connection, "EL-300", 8)
None
after EL-300
(5, 'EL-300', 'Projector', 'electronics', 8)

De functie geeft voorlopig nog steeds None terug. Lees de rijen vóór en na de wijziging als bewijs: alleen de laatste waarde is veranderd. Run probeert ook NO-404, dat met geen enkele rij overeenkomt, en toont daarna EL-400 als ongewijzigd ander voorwerp.

De bestaande regel van de tabel voor een positieve termijn blijft gelden. Deze functie vervangt die regel niet en vangt de fout ervan niet op. Ze bindt de voorgestelde waarde veilig; de database bepaalt nog steeds of de waarde aan het schema voldoet.

Submit gebruikt onbekende codes, een ontbrekende code, apostrofs, tekst die op SQL lijkt en verschillende positieve termijnen met gehele getallen en kommagetallen. Houd beide veranderende waarden buiten de instructie, in de volgorde van de placeholders. Filter niet op een niet-unieke naam of categorie en open geen andere verbinding.

Een veilige wijziging heeft beide delen nodig die je nu kunt zien: de nieuwe waarde in SET en de uniek identificerende waarde in de WHERE van dezelfde instructie.

Opdracht

Corrigeer in change_loan_days de parametertuple naar (loan_days, asset_tag). Behoud de gebonden WHERE asset_tag = ? binnen de UPDATE.

Voer het project uit, vergelijk de rij vóór en na de wijziging en het ongewijzigde andere voorwerp en stuur het daarna in.