Mi a fő problémája ennek a megvalósításnak BEGIN; CREATE TABLE sneakers ( id SERIAL PRIMARY KEY, design JSON NOT NULL ); CREATE OR REPLACE FUNCTION process_sneaker_order(sneaker_id INTEGER) RETURNS VOID AS $$ BEGIN UPDATE sneakers SET design = jsonb_set(design, '{status}', '"Processed"') WHERE id = sneaker_id; END; $$ LANGUAGE plpgsql; INSERT INTO sneakers (design) VALUES ('{"colors":"red,blue", "status":"Pending"}'); PERFORM process_sneaker_order(1); -- COMMIT;
sobes.tech MI
Válasz az MI-től
A jelenlegi megvalósítás fő problémája, hogy nincs explicit tranzakciókövetelmény. A kódban a tranzakció a BEGIN;-el kezdődik, létrejön a tábla és a függvény, majd beszúrunk egy rekordot és meghívjuk az frissítő függvényt, de a COMMIT; sor kommentelve van. Ez azt jelenti, hogy a változtatások nem lesznek véglegesítve az adatbázisban, és minden művelet visszavonásra kerül a session végén.
Ezenkívül a jsonb_set használata json típusúval, a függvény pedig jsonb-vel való működése hibákhoz vezethet. Érdemes a design oszlopot eleve jsonb-ként deklarálni.
Javítási példa:
BEGIN;
CREATE TABLE sneakers (
id SERIAL PRIMARY KEY,
design JSONB NOT NULL
);
CREATE OR REPLACE FUNCTION process_sneaker_order(sneaker_id INTEGER) RETURNS VOID AS $$
BEGIN
UPDATE sneakers SET design = jsonb_set(design, '{status}', '"Processed"') WHERE id = sneaker_id;
END;
$$ LANGUAGE plpgsql;
INSERT INTO sneakers (design) VALUES ('{"colors":"red,blue", "status":"Pending"}');
PERFORM process_sneaker_order(1);
COMMIT;
Továbbá, fontos megjegyezni, hogy a táblák és függvények létrehozását általában adatkezelési tranzakciókon kívül szokták elvégezni, hogy elkerüljék a zárolásokat és a hibákat a termelésben.