Topic: [MariaDB] Problema con JSON field  (Letto 190 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline tommyb1992

  • python neanderthalensis
  • ****
  • Post: 297
  • Punti reputazione: 0
    • Mostra profilo
[MariaDB] Problema con JSON field
« il: Agosto 16, 2018, 09:06 »
Ho un campo di tipo "JSON" in MariaDB, ma ho scoperto che in realtà non è JSON ma:
Citazione
JSON is an alias for LONGTEXT introduced for compatibility reasons with MySQL's JSON data type

Quindi è un longtext, come trasformo un testo in un Json? (p.s. mi ha anche cambiato gli apici, perciò json.loads non è applicabile)

Potrei fare un replace("'", '"'), ma boh, poi potrei dover lavorare con le eccezioni per correggere eventuali problemi con un parser...
« Ultima modifica: Agosto 16, 2018, 09:21 da tommyb1992 »

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 2.854
  • Punti reputazione: 9
    • Mostra profilo
Re:[MariaDB] Problema con JSON field
« Risposta #1 il: Agosto 16, 2018, 12:13 »
Ma senti, la butto lì: e usare un database serio e semplificarsi la vita, proprio non lo prendiamo in considerazione nemmeno per un attimo, vero?
Vedi anche il pasticcio di https://forumpython.it/database/(risolto)unicodeencodeerror-'latin-1'-codec-can't-encode-character-'u20ac'-in/.

Comunque, se il campo è in definitiva un TEXT "comune", puoi semplicemente buttarci dentro il risultato di un json.dumps e poi fare json.loads sulla stringa che leggi dal db. Ovviamente ti perdi tutte le feature che un campo json nativo ti darebbe, ma pazienza, suppongo.

> mi ha anche cambiato gli apici
Cosa vuol dire "ti ha cambiato gli apici"? Ovviamente *non* ti ha cambiato gli apici, mica è un diavoletto malvagio che di testa sua si mette a cambiare gli apici, no?
Se ci butti dentro il risultato di un json.dumps, quello che ci butti dentro è in definitiva una stringa prodotta da python, in formato json. Il formato json impone che la stringa inizia e finisce con apici doppi, e al suo interno escapa ovviamente gli eventuali apici doppi. Quando poi leggi la stringa dal database e la passi a json.loads di python, ottieni di nuovo la stringa originale (senza apici doppi all'estremità, voglio dire).
Se poi inoltre MariaDB (che già un database che si chiama MariaDB invoglia a imprecare, no?) si mette a fare degli escape ulteriori per conto suo quando scrivi nel campo, allora boh non so perché dovrebbe, ma poco male: suppongo che farà anche gli opportuni de-escape quando poi vai a leggere, quindi non dovresti comunque avere problemi.

> Potrei fare un replace("'", '"'), ma boh, poi potrei dover lavorare con le eccezioni per correggere eventuali problemi con un parser...
Ecco, magari proprio no. Non ficchiamoci in un altro buco nero come l'altro thread, a forza di applicare "soluzioni" ingegnose.
C'è UN modo di fare le cose per bene. Se non stai avendo il risultato giusto, vuol dire che non stai facendo le cose in QUEL modo. Leggi bene la documentazione di tutto finché non trovi il modo giusto.

Offline tommyb1992

  • python neanderthalensis
  • ****
  • Post: 297
  • Punti reputazione: 0
    • Mostra profilo
Re:[MariaDB] Problema con JSON field
« Risposta #2 il: Agosto 16, 2018, 12:58 »
lol beh dai MariaDB è la fork ufficiale del creatore di MySQL dopo che fu acquistato da X multinazionale.

Però sul nome ho da obiettare anche io...


Citazione
Cosa vuol dire "ti ha cambiato gli apici"? Ovviamente *non* ti ha cambiato gli apici, mica è un diavoletto malvagio che di testa sua si mette a cambiare gli apici, no?
Eh si mi sa che sono un idiota, io inserisco un dict, non un json, perchè facendo un veloce test:

import json

from db import cnn

cnn.exec("CREATE DATABASE IF NOT EXISTS test")
cnn.exec("CREATE TABLE IF NOT EXISTS test.test(xxx JSON)")
cnn.exec("INSERT INTO test.test VALUES (%s)", [json.dumps({"boh": 1})])
cnn.exec("SELECT xxx FROM test.test LIMIT 1")
res = json.loads(cnn.fetch()[0])
print(res["boh"])


(test) C:\Users\Tomas\Desktop\test>python test.py
1

Funziona alla grande.

Grazie non mi sarei accorto di ciò senza la tua risposta...