sql >> Databáze >  >> RDS >> PostgreSQL

Aktualizace pole json v Postgresu

Žádné eval je požadováno. Váš problém je, že nedekódujete hodnotu jako objekt json.

CREATE OR REPLACE FUNCTION json_update(data json, key text, value json)
RETURNS json AS
$BODY$
   from json import loads, dumps
   if key is None: return data
   js = loads(data)
   # you must decode 'value' with loads too:
   js[key] = loads(value)
   return dumps(js)
$BODY$
LANGUAGE plpythonu VOLATILE;

postgres=# SELECT json_update('{"a":1}', 'a', '{"innerkey":"innervalue"}');
            json_update            
-----------------------------------
 {"a": {"innerkey": "innervalue"}}
(1 row)

Nejen to, ale také pomocí eval k dekódování json je nebezpečný a nespolehlivý. Je to nespolehlivé, protože json není Python, jen se stává, že většinu času vyhodnotí trochu podobně. Je to nebezpečné, protože nikdy nevíte, co můžete hodnotit. V tomto případě jste z velké části chráněni analyzátorem json PostgreSQL:

postgres=# SELECT json_update(
postgres(#    '{"a":1}', 
postgres(#    'a', 
postgres(#    '__import__(''shutil'').rmtree(''/glad_this_is_not_just_root'')'
postgres(# );
ERROR:  invalid input syntax for type json
LINE 4:          '__import__(''shutil'').rmtree(''/glad_this_is_not_...
                 ^
DETAIL:  Token "__import__" is invalid.
CONTEXT:  JSON data, line 1: __import__...

... ale vůbec se nebudu divit, když někdo dokáže podsunout eval využít toho v minulosti. Takže ponaučení zde:nepoužívejte eval .



  1. Další chyba UnicodeEncodeError při použití metody pandas to_sql s MySQL

  2. Jak rozdělím oddělený řetězec na serveru SQL bez vytvoření funkce?

  3. Jak importuji MySql Connector do Unity Project?

  4. Název, který již používá existující objekt ve VBA