2025, Oct 07 13:16

Как исправить UnicodeDecodeError psycopg2 в Odoo 18 на Windows

Разбираем причину падения Odoo 18 на Windows с ошибкой UnicodeDecodeError в psycopg2 (байт 0xe7, символ ç) и как очистить DSN и переменные PG для запуска.

Odoo 18 в Windows может корректно стартовать, загрузить дополнения, а затем упасть сразу после запуска HTTP‑сервиса с ошибкой UnicodeDecodeError от psycopg2. Обычно сообщение выглядит как сбой декодирования UTF‑8 на байте 0xe7, что соответствует символу ç. На деле это указывает на не‑UTF‑8 символ, попавший в сведения о подключении к базе данных, используемые для доступа к PostgreSQL.

Воспроизведение в контексте

На свежем клоне с настроенной виртуальной средой и установленными зависимостями сервер запускается так:

PS D:\tarefas\trarefa_kaue_1\teste\odoo> python odoo-bin -r odoo -w 123

Логи подтверждают, что сервер стартует, но затем один из фоновых потоков выбрасывает исключение:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe7 in position 78: invalid continuation byte

Что происходит на самом деле

Сбой возникает внутри psycopg2.connect, когда библиотека собирает или разбирает DSN (строку подключения) к PostgreSQL. Наличие байта 0xe7 означает, что где‑то в пути подключения присутствует символ ç (c с седилью) и он интерпретируется не как UTF‑8. Этот символ может встретиться где угодно: в названии базы, имени пользователя, имени хоста или даже в сегменте пути Windows, который стек использует для поиска конфигурации. Если любое из этих значений содержит ç (или другой не‑ASCII символ), этап декодирования в psycopg2 может «взорваться» уже при первом потоке cron или при любом обращении к базе.

0xe7 — это символ ç. Где‑то в вашем DSN базы данных (строка подключения, имя базы и т. п.) или в переменной окружения Windows встречается символ вне UTF‑8 (скорее всего, ç в названии папки, пользователя или хоста...).

Откуда берётся DSN в Windows

Odoo передаёт psycopg2 параметры подключения. Эти параметры берутся из нескольких источников в чётко определённом порядке. В первую очередь используются аргументы odoo-bin. Имя базы, пользователя, пароль, хост и порт можно указать прямо в командной строке вместе с путями к модулям и конфигу. Для справки, типичные ключи такие:

-d <databasename> --database <databasename>
-r <user>        --db_user <user>
-w <password>    --db_password <password>
--db_host <hostname>
--db_port <port>
-c <config>      --config <config>
-D <data-dir-path> --data-dir <data-dir-path>

Если чего‑то нет в командной строке, Odoo подхватывает эти же параметры из конфигурационного файла. Минимальный пример выглядит так:

db_host = localhost
db_port = 5432
db_user = odoo
db_password = 123

Если чего‑то всё ещё не хватает, psycopg2 учитывает стандартные переменные окружения PostgreSQL. Важные из них: PGHOST, PGPORT, PGUSER, PGPASSWORD и PGDATABASE. Наконец, в Windows есть ещё сервисный файл PostgreSQL, из которого тоже подтягиваются настройки: %APPDATA%\postgresql\pg_service.conf. Любой из этих источников способен протащить в DSN символ вне UTF‑8.

Как это исправить

Самая вероятная причина здесь — символ вне UTF‑8, в частности ç, попавший в один из входных параметров DSN. Уберите этот символ везде, где он встречается на пути подключения. Проверьте аргументы odoo-bin, конфигурационный файл Odoo, переменные окружения PG*, а также сервисный файл PostgreSQL в Windows. Учтите и неявные ссылки на папки, имена пользователей или хосты, где может встретиться ç. Убедитесь, что фактические значения host, database, user и password содержат только ASCII или корректный UTF‑8.

Для проверки на здравый смысл убедитесь, что конфиг Odoo, из которого берутся параметры подключения, не содержит спецсимволов. Базовый вариант выглядит так:

db_host = localhost
db_port = 5432
db_user = odoo
db_password = 123

Если вы опирались на переменные окружения, проверьте, что в них нет ç и подобных символов. Речь о следующих переменных:

PGHOST
PGPORT
PGUSER
PGPASSWORD
PGDATABASE

После исправления или очистки этих значений сервер должен пройти этап запуска cron без UnicodeDecodeError.

Почему это важно для Windows‑стеков Odoo

Пути, профили и имена хостов в Windows часто содержат буквы с диакритикой, и они незаметно просачиваются в сервисные файлы и переменные окружения. Клиенты БД вроде psycopg2 строги к кодировкам и падают рано — это полезно, но сбивает с толку, если непонятно, где собирается DSN. Понимание всех мест, откуда Odoo и psycopg2 берут параметры подключения, экономит часы на догадках.

Выводы

Если Odoo 18 в Windows падает с UnicodeDecodeError от psycopg2 и упоминает байт 0xe7, ищите символ ç по всей цепочке входов DSN. Проверьте аргументы командной строки, конфигурационный файл Odoo, переменные окружения PG* и сервисный файл PostgreSQL в %APPDATA%\postgresql. Держите значения подключения в пределах ASCII или корректного UTF‑8 — и сервер запустится без сбоев.

Материал основан на вопросе на StackOverflow от Kaue Martins и ответе Ahrimann Steiner.