"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Doctrine DBAL 4에서 사용자 정의 색인을 무시합니다.

Doctrine DBAL 4에서 사용자 정의 색인을 무시합니다.

2024-07-31에 게시됨
검색:954

Ignore custom indexes on Doctrine DBAL 4

엔티티 파일의 #[ORM\Index(fields: ['fieldName'] 속성을 사용하여 데이터베이스 색인을 생성할 수 있으며 Doctrine이 색인 관리를 위한 나머지 작업을 수행합니다. 그것에 대해서는 이야기하지 않겠습니다.

프로젝트가 성장하거나 특정 요구 사항이 필요하면 GIST, GIN, BRIN 등과 같은 사용자 정의 인덱스 유형을 사용해야 할 수도 있습니다(https://www.postgresql.org/docs/current/indexes-types.html). Doctrine은 데이터베이스 공급업체별 인덱스 유형 기본(ref) 생성을 지원하지 않습니다.

이 문제를 해결하려면 CREATE INDEX DDL을 데이터베이스에 직접 실행하거나 교리 마이그레이션 파일에 DDL을 작성할 수 있습니다. 후자의 옵션을 사용하면 변경 사항을 더 쉽게 배포하거나 롤백할 수 있다는 이점이 있습니다.

사용자 정의 색인을 생성하는 데 어떤 방법을 사용하든 상관없이 Doctrine은 항상 해당 사용자 정의 색인을 매핑되지 않은 색인으로 표시하므로doctrine:schema:validate를 실행하면 데이터베이스가 동기화되지 않은 경우 다음과 같은 오류가 발생합니다. Doctrine:schema:update --dump-sql 또는 Doctrine:migrations:diff를 실행하는 동안에도 마찬가지로 사용자 정의 인덱스를 제거하는 DROP INDEX ... 문이 표시됩니다.

해결책

저는 이 패키지 버전을 사용하고 있습니다. (저는 이 솔루션이 동일한 주요 패키지 버전에서 작동할 것이라고 믿습니다.):

    doctrine/dbal 4.0.4
  • 교리/교리 번들 2.12.0
이 문제를 처리하기 위한 여러 튜토리얼을 찾았지만 만족스럽지 않습니다.

    https://www.liip.ch/en/blog/doctrine-and-generated-columns Doctrine DBAL이 DBAL 4에서 이벤트 관리자를 제거함에 따라 더 이상 작동하지 않았습니다. (참조)
  • https://medium.com/yousign-engineering-product/ignore-custom-indexes-on-doctrine-dbal-b5131dd22071 이는 지원 중단 메시지를 표시했습니다. "platform_service" 구성 키는 Doctrine-bundle 2.9부터 더 이상 사용되지 않습니다. DBAL 4는 더 이상 연결 매개변수를 통한 사용자 정의 플랫폼 설정을 지원하지 않습니다. (참조)
여기에서 platform_service 구성 교체에 대한 GitHub 문제를 발견했습니다. https://github.com/doctrine/DoctrineBundle/issues/1656.

이 두 페이지를 읽으면서 Doctrine 미들웨어를 통해 사용자 정의 DBAL 플랫폼을 사용하는 방법에 대한 모든 정보를 얻었습니다.

    https://github.com/doctrine/dbal/pull/5699
  • https://symfony.com/bundles/DoctrineBundle/current/middlewares.html
드디어 소스코드를 파헤친 끝에 해결책을 찾았습니다. 4개의 파일을 생성해야 합니다. 2개 파일은 Doctrine 미들웨어에 관한 것이고 다른 2개 파일은 Doctrine DBAL 플랫폼 및 스키마에 관한 것입니다.

필요에 따라 네임스페이스와 클래스 이름을 수정합니다.

참, 'index_name_2' => 참, ]; #[\우세하다] 보호된 함수 _getPortableTableIndexesList(array $tableIndexes, string $tableName): 배열 { $indexes = parent::_getPortableTableIndexesList($tableIndexes, $tableName); foreach (array_keys($indexes) as $indexName) { if (isset(self::IGNORED_INDEXES[$indexName])) { unset($indexes[$indexName]); } } $인덱스를 반환합니다. } }
 true,
        'index_name_2' => true,
    ];

    #[\Override]
    protected function _getPortableTableIndexesList(array $tableIndexes, string $tableName): array
    {
        $indexes = parent::_getPortableTableIndexesList($tableIndexes, $tableName);

        foreach (array_keys($indexes) as $indexName) {
            if (isset(self::IGNORED_INDEXES[$indexName])) {
                unset($indexes[$indexName]);
            }
        }

        return $indexes;
    }
}
릴리스 선언문 이 글은 https://dev.to/indragunawan/ignore-custom-indexes-on-doctrine-dbal-4-387j?1 에서 복제되었습니다.1 침해 내용이 있는 경우, [email protected]으로 연락하여 삭제하시기 바랍니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3