PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Aktualizacja pola json w Postgres

Brak eval jest wymagane. Twój problem polega na tym, że nie dekodujesz wartości jako obiektu 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)

Nie tylko to, ale używanie eval dekodować json jest niebezpieczny i zawodny. Jest zawodny, ponieważ json nie jest Pythonem, po prostu zdarza się, że ocenia się trochę tak przez większość czasu. To niebezpieczne, ponieważ nigdy nie wiesz, co możesz oceniać. W tym przypadku jesteś w dużej mierze chroniony przez parser 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 wcale się nie zdziwię, jeśli ktoś może poślizgnąć się eval wykorzystaj przeszłość. Tak więc lekcja tutaj:nie używaj eval .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. [Wideo] Ansible i PostgreSQL

  2. nie można załadować biblioteki dla oracle_fdw

  3. Zapytanie Postgres jsonb na zagnieżdżonym obiekcie

  4. Jak zaokrąglić średnią do 2 miejsc po przecinku w PostgreSQL?

  5. Czas Postgresa z równością stref czasowych