To pytanie nie dotyczy bytea v. Oid v. Blob v. Dużych obiektów itp.
Mam tabelę zawierającą integer
pole klucza podstawowego i bytea
pole. Chciałbym wprowadzić dane w bytea
pole. Można to przypuszczalnie zrobić w jednym z PL/
języków i mogę się tym zająć PL/Python
w przyszłości.
Ponieważ wciąż testuję i eksperymentuję, chciałbym po prostu wstawić dane z pliku (na serwerze) przy użyciu „standardowych” instrukcji SQL. Wiem, że tylko administratorzy z uprawnieniami do zapisu na serwerze mogliby wstawiać dane w sposób, w jaki chciałbym. Nie martwię się tym na tym etapie, ponieważ użytkownicy nie będą obecnie wstawiać bytea
danych. Przeszukałem różne strony StackExchange, archiwa PostgreSQL i ogólnie Internet, ale nie byłem w stanie znaleźć odpowiedzi.
Edycja: Ta dyskusja z 2008 roku sugeruje, że to, co chcę zrobić, nie jest możliwe. Jak zatem bytea
wykorzystywane są pola?
Edycja: To podobne pytanie z 2005 roku pozostaje bez odpowiedzi.
Rozwiązane: szczegóły podane tutaj na psycopg
stronie internetowej stanowiły podstawę rozwiązania, które napisałem w języku Python. Może być również możliwe wstawienie danych binarnych do bytea
kolumny za pomocą PL/Python
. Nie wiem, czy jest to możliwe przy użyciu „czystego” SQL.
źródło
blob
). Jeśli to był błąd, szczerze przepraszam.blob
jest ok, może niedatafile
ma znaczenia.Odpowiedzi:
jako administrator:
lo_get
został wprowadzony w wersji 9.4, więc dla starszych wersji potrzebujesz:następnie:
źródło
Zastosowanie
pg_read_file('location_of file')::bytea
.Na przykład,
podręcznik
źródło
pg_read_binary_file('/path/to/file')
. Zobacz postgresql.org/docs/current/static/functions-admin.htmlTo rozwiązanie nie jest dokładnie wydajne pod względem czasu działania, ale jest banalnie łatwe w porównaniu do tworzenia własnych nagłówków
COPY BINARY
. Co więcej, nie wymaga żadnych bibliotek ani skryptów poza bash.Najpierw przekonwertuj plik na zrzut heksowy, podwajając rozmiar pliku.
xxd -p
przybliża nas do siebie, ale wprowadza denerwujące nowości, którymi musimy się zająć:Następnie zaimportuj dane do PostgreSQL jako bardzo duże
text
pole. Ten typ mieści do jednego GB na wartość pola, więc w większości przypadków powinniśmy być w porządku:Teraz, gdy nasze dane są nieskończenie dużym ciągiem szesnastkowym, używamy PostgresQL-a,
decode
aby uzyskaćbytea
typ:źródło
tr -d '\n'
Działa na wyjściu xxd, który koduje binarne treść wejścia jako znaki ASCII w kodzie szesnastkowym (0-9 i AF). xxd zdarza się również w liniach wyjściowych w regularnych odstępach czasu, aby dane wyjściowe były czytelne dla człowieka, ale w tym przypadku chcemy, aby zostały usunięte. Informacje o liniach w oryginalnych danych będą w postaci szesnastkowej i pozostaną nienaruszone.Odpowiedź z xxd jest miła, a dla małych plików, bardzo szybko. Poniżej znajduje się przykładowy skrypt, którego używam.
źródło
Użyj funkcji Postgres COPY BINARY . Jest to zasadniczo odpowiednik zewnętrznych tabel Oracle .
źródło
bytea
kolumny?