Nie można przekonwertować kolumny tekstowej PostgreSQL na bajt
W mojej aplikacji używam tabeli bazy danych postgresql z kolumną „tekstową” do przechowywania marynowanych obiektów Pythona. Jako sterownik bazy danych używam psycopg2 i do tej pory przekazywałem tylko łańcuchy python (nie obiekty-unicode) do bazy danych i pobierałem ciągi z bazy danych. Zasadniczo działało to dobrze, dopóki nie zdecydowałem, że String-handling będzie lepszy / poprawny i dodałem następującą konstrukcję do mojej warstwy DB:
psycopg2.extensions.register_type(psycopg2.extensions.UNICODE)
psycopg2.extensions.register_type(psycopg2.extensions.UNICODEARRAY)
To w zasadzie działa dobrze wszędzie w mojej aplikacji i używam obiektów unicode tam, gdzie to możliwe.
Ale w tym specjalnym przypadku z kolumną tekstową zawierającą marynowane obiekty sprawia kłopoty. W ten sposób działałem w moim systemie testowym:
pobieranie danych:SELECT data::bytea, params FROM mytable
pisanie danych:execute("UPDATE mytable SET data=%s", (psycopg2.Binary(cPickle.dumps(x)),) )
... ale niestety otrzymuję błędy z SELECT dla niektórych kolumn w systemie produkcyjnym:
psycopg2.DataError: invalid input syntax for type bytea
Ten błąd występuje również, gdy próbuję uruchomić zapytanie w powłoce psql.
Zasadniczo zamierzam przekonwertować kolumnę z „tekstu” na „bytea”, ale powyższy błąd uniemożliwia mi także wykonanie tej konwersji.
O ile widzę, (przy pobieraniu kolumny jako czysty łańcuch pythona) w łańcuchu są tylko znaki z ord (c) <= 127.