J'ai étudié comment utiliser le côté données propre à PostgreSQL à partir de Python, je vais donc l'enregistrer.
Il s'agit du type jsonb.
Ce contenu est un extrait du contenu présenté au 51e Nagaoka IT Developer Study Group. La diapositive est ici.
La version Python est ici.
Lors de l'utilisation de PostgreSQL depuis une application Utiliser via l'API JDBC. L'API JDBC est une spécification avec uniquement une interface, et il existe un pilote JDBC pour PostgreSQL comme implémentation. Il s'agit du pilote JDBC officiel de PostgreSQL.
Il existe différentes bibliothèques d'accès à la base de données via JDBC, mais cette fois, nous allons considérer un exemple d'utilisation de JPA comme spécification de persistance standard Java. JPA est également une spécification et une interface est préparée. L'une des implémentations est EclipseLink.
https://github.com/civic/postgresql-java-json
id | info |
---|---|
1 | {"a": 100, "b": "Hello"} |
2 | {"a": 200, "b": "World"} |
CREATE TABLE json_test(
id integer,
info jsonb
)
SELECT
resultSet.getString("info");
// {"a": 100, "b": "Hello"}
Vous pouvez obtenir la chaîne de caractères JSON en récupérant la colonne json et en obtenantString.
INSERT (1)
import org.postgresql.util.PGobject;
PGobject pgobj =new PGobject();
pgobj.setValue(json_string); //chaîne json
pgobj.setType("jsonb");
preparedStatement.setObject(1, pgobj);
Il n'y a pas de type JSON dans l'API JDBC. Il est généralement utilisé via l'interface fournie par JDBC, mais il n'y a pas d'autre choix que d'utiliser les fonctions du pilote fourni par PostgreSQL. Doit être utilisé dans des domaines limités tels que les bibliothèques communes.
INSERT (2)
PreparedStatement ps =conn.prepareStatement(
"INSERT INTO json_test(info) VALUES(jsonb(?))"
);
ps.setString(1, json_string); //chaîne json
Un modèle qui définit les paramètres sous forme de chaîne JSON et les convertit en jsonb dans une instruction SQL. Comme il s'agit de setString sous forme de chaîne de caractères, cela n'est possible qu'avec l'API standard.
SELECT / INSERT
@Entity
@Table(name = "json_test")
public class JsonTest implements Serializable {
// ...Omission...
@Column(name = "info")
@Convert(converter = JsonbConverter.class)
private String info;
...
JPA, une fonction de persistance semblable à un mappeur OR. Un mécanisme appelé Converter est préparé dans les spécifications JPA. Si vous créez un convertisseur et définissez une conversion mutuelle de type Java <=> SQL, vous pouvez l'utiliser pour la définition de colonne avec des annotations.
/**
@Converter
public class JsonbConverter implements AttributeConverter<String, PGobject>{
/**
* String-Conversion en Pgobject
* @param x
* @return
*/
@Override
public PGobject convertToDatabaseColumn(String x) {
PGobject pgobject =new PGobject();
pgobject.setType("jsonb");
try {
pgobject.setValue(x);
} catch (SQLException ex) {
Logger.getLogger(JsonbConverter.class.getName()).log(Level.SEVERE, null, ex);
throw new RuntimeException(ex);
}
return pgobject;
}
@Override
/**
* Pgobject-Convertir en chaîne
* @param y
* @return
*/
public String convertToEntityAttribute(PGobject y) {
return y.getValue();
}
}
Recommended Posts