Symfony/Doctrine: Проблема миграции PostgreSQL – неопределенная ошибка столбца только в ядре HTTP (CLI работает)MySql

Форум по Mysql
Ответить
Anonymous
 Symfony/Doctrine: Проблема миграции PostgreSQL – неопределенная ошибка столбца только в ядре HTTP (CLI работает)

Сообщение Anonymous »

Symfony/Doctrine: проблема миграции PostgreSQL — неопределенная ошибка столбца только в ядре HTTP (CLI работает)
Я работаю над проектом Symfony 7.3, работающим на PHP 8.2. Недавно я перенес базу данных с MySQL на PostgreSQL, и с тех пор я столкнулся с очень специфичной проблемой с ORM Doctrine, которая проявляется только в контексте HTTP.
Проблема
Когда я пытаюсь получить данные из таблицы user через HTTP-запрос, я получаю следующую ошибку SQL:

Код: Выделить всё

SQLSTATE[42703]: Undefined column: 7
ERROR:  column t0.id does not exist
LINE 1: SELECT t0.id AS id_1, t0.email AS email_2, t0.password AS pa...
Эта ошибка эксклюзивна для любого кода, выполняемого в ядре HTTP (например, контроллеров, прослушивателей).
Фактические наблюдения (важно)

1. Интерфейс командной строки (CLI) работает нормально✔️

При выполнении запросов непосредственно через консоль Symfony (которая использует ту же самую конфигурацию Doctrine и подключение к базе данных) все работает отлично. Это подтверждает существование таблицы public.user и идентификатора столбца.

2. Сбой изолированного контроллера отладки ❌

Минимальный контроллер отладки, извлекающий объект User, вызывает ошибку.

3. Рабочий контрпример (Подсказка) 💡

Конструктивно идентичный контроллер для

Код: Выделить всё

CustomerОбъект 
[/b] (имя таблицы customer, которое не является зарезервированным ключевым словом PostgreSQL) работает без ошибок. Это явно указывает на конфликт с зарезервированным ключевым словом .[/b].
Сведения об объекте и базе данных

Пользовательский объект (сокращенно)

Объект использует стандартные аннотации Doctrine:

Код: Выделить всё

// src/Entity/User.php
#[ORM\Entity(repositoryClass: 'App\Repository\UserRepository')]
#[ORM\Table(name: 'user')] // Problematic line
class User {
// ... ORM\Id and ORM\Column definitions
}

Структура базы данных

  • СУБД: PostgreSQL
  • Имя таблицы в БД: user (строчные буквы, общедоступная схема)
  • Факт PostgreSQL: Слово user является зарезервированным ключевым словом SQL.
Временное исправление и основной вопрос ⚠️
Я обнаружил, что ошибка устраняется вручную заставляя Doctrine цитировать имя таблицы с помощью обратных кавычек в сопоставлении сущностей:

Код: Выделить всё

// Temporary Fix
#[ORM\Table(name: '`user`')]
Хотя это решение работает, я отклоняю его как постоянное исправление. Оно вводит неприглядное исключение в мой чистый код сущности, обращается только к этому единственному зарезервированному слову и не обеспечивает перспективной глобальной гарантии того, что Doctrine будет правильно обрабатывать другие зарезервированные ключевые слова PostgreSQL (например, group, order и т. д.) без ручного вмешательства.

Вопрос
Основываясь на подтвержденной основной причине (пользователь зарезервированного ключевого слова PostgreSQL не надежно цитируется в контексте HTTP) и стремлении к чистому, глобальному решению:
Какой базовый параметр конфигурации Doctrine DBAL или Symfony (например, в Doctrine.yaml), который должен быть применен к соединению PostgreSQL, чтобы глобально обеспечить соблюдение правильное поведение кавычек для всех зарезервированных ключевых слов SQL, что позволяет сопоставлению сущностей оставаться чистым (

Код: Выделить всё

#[ORM\Table(name: 'user')]
) и гарантировать будущую совместимость с PostgreSQL?[/b]

Подробнее здесь: https://stackoverflow.com/questions/798 ... only-in-ht
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «MySql»