Prawidłowy JSON może oczywiście mieć znak ukośnika odwrotnego: \. Po wstawieniu danych do instrukcji SQL w następujący sposób:Wstawianie poprawnego jsona z kopią do tabeli postgresowej
sidharth=# create temp table foo(data json);
CREATE TABLE
sidharth=# insert into foo values('{"foo":"bar", "bam": "{\"mary\": \"had a lamb\"}" }');
INSERT 0 1
sidharth=# select * from foo;
data
\-----------------------------------------------------
{"foo":"bar", "bam": "{\"mary\": \"had a lamb\"}" }
(1 row)
Wszystko działa dobrze.
Ale gdybym skopiuj JSON do pliku i uruchom polecenie kopiowania uzyskać:
sidharth=# \copy foo from './tests/foo' (format text);
ERROR: invalid input syntax for type json
DETAIL: Token "mary" is invalid.
CONTEXT: JSON data, line 1: {"foo":"bar", "bam": "{"mary...
COPY foo, line 1, column data: "{"foo":"bar", "bam": "{"mary": "had a lamb"}" }"
Wygląda PostgreSQL nie jest przetwarzanie backslashy. Myślę, że z powodu http://www.postgresql.org/docs/8.3/interactive/sql-syntax-lexical.html i jestem zmuszony użyć podwójnego ukośnika odwrotnego. A to działa, tj. Gdy zawartość pliku:
{"foo":"bar", "bam": "{\\"mary\\": \\"had a lamb\\"}" }
Polecenie kopiowania działa. Ale czy słuszne jest spodziewać się specjalnej obróbki dla typów danych JSON? , ponieważ po powyższym nie jest prawidłowym jsonem.
Nie rozumiem odpowiedź. W szczególności dlaczego ucieczka nie jest wykonywana przez PostgreSQL? Wygląda na to, że PostgreSQL akceptuje plik oddzielony tabulatorami (który może zawierać JSON wewnątrz), a nie tylko plik JSON. –
@ChrisStryczynski To prawda. To jest TSV. 'COPY' nie jest używane do ładowania pojedynczych pól, służy do ładowania tabel *. –