PostgreSQL: insérer des données dans une table à partir de json
Maintenant, j'utilise manuellement parser json en insérer une chaîne de caractères comme
insert into Table (field1, field2) values (val1, val2)
mais ce n'est pas confortable pour insérer des données à partir json!
J'ai trouvé la fonction json_populate_record et a essayé de l'utiliser:
create table test (id serial, name varchar(50));
insert into test select * from json_populate_record(NULL::test, '{"name": "John"}');
mais il échoue avec le message: valeur null dans la colonne "id" viole non-nulle contrainte
PG sait que l'id est de série, mais fait semblant d'être un imbécile. De même, il ne pour tous les domaines avec les valeurs par défaut.
Est-il plus élégant vay pour insérer des données à partir de json dans une table?
"J'ai trouvé la fonction
C'est de 9,3 bêta de la fonction
json_populate_record
". La messagerie unifiée. Où? Quelle est la définition de la fonction? Utilisez-vous PostgreSQL 9.3 beta, ou est-il une fonction que vous avez installé à partir de quelque part d'autre?C'est de 9,3 bêta de la fonction
OriginalL'auteur user2627000 | 2013-07-28
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas de moyen facile pour
json_populate_record
retour d'un marqueur qui signifie "générer cette valeur".PostgreSQL ne pas vous permettent d'insérer des
NULL
pour spécifier qu'une valeur doit être généré. Si vous demandezNULL
Pg s'attend à direNULL
et ne veut pas de deuxième deviner vous. En outre, il est parfaitement OK pour avoir un générés colonne qui n'a pas deNOT NULL
contrainte, auquel cas il est parfaitement bien pour insérerNULL
.Si vous voulez avoir PostgreSQL utiliser le tableau de la valeur par défaut pour une valeur d'il y a deux façons de le faire:
INSERT
de la colonne de la liste; ouDEFAULT
, qui n'est valide que dans unVALUES
expressionPuisque vous ne pouvez pas utiliser
VALUES(DEFAULT, ...)
ici, votre seule option est de les omettre la colonne de laINSERT
de la colonne de la liste:Oui, cela signifie que vous devez dresser la liste des colonnes. Par deux fois, en fait, une fois dans le
SELECT
liste et une fois dans laINSERT
colonne de la liste.Pour éviter la nécessité pour que cette PostgreSQL aurait besoin d'avoir un moyen de préciser
DEFAULT
comme une valeur pour un record, alorsjson_populate_record
pourrait revenirDEFAULT
au lieu deNULL
pour les colonnes qui ne sont pas définies. Qui pourrait ne pas être ce que vous avez prévu pour toutes les colonnes et conduirait à la question de savoir commentDEFAULT
serait traitée lors de lajson_populate_record
était pas être utilisés dans unINSERT
expression.Donc je suppose que
json_populate_record
peut-être moins utile que vous espériez pour les lignes avec des clés générées.UPDATE
trop, basé sur json entrée ?Je ne suis pas vraiment sûr de ce que vous demandez. Je suggère de poster une nouvelle bien détaillées question et en la reliant à celle-ci pour le contexte.
Des informations très utiles (documentation pour
json_populate_record
est un peu clairsemée). Mais il ne semble vraiment pas être une bonne affaire pour une option à l'effet de "où aucune valeur spécifiée, utilisez la valeur par défaut".OriginalL'auteur
Continue de Craig répondre, vous avez probablement besoin d'écrire une sorte de procédure stockée à exécuter la dynamique nécessaire SQL, comme suit:
Qui vous pouvez appeler avec
OriginalL'auteur