Undefined object 7 error index primary does not exist

How to use GitHub Please use the 👍 reaction to show that you are affected by the same issue. Please don't comment if you have no relevant information to add. It's just extra noise for everyone subscribed to this issue. Subscribe to rec...

blizzz opened this issue a year ago · comments

How to use GitHub

  • Please use the 👍 reaction to show that you are affected by the same issue.
  • Please don’t comment if you have no relevant information to add. It’s just extra noise for everyone subscribed to this issue.
  • Subscribe to receive notifications on status change and new comments.

Steps to reproduce

  1. Get latest 22.2.3/23.0.0 and install it
  2. enable LDAP, configure it with groups, visit users page to ensure the mapping tables are not empty
  3. switch to beta channel
  4. upgrade

Expected behaviour

  • upgrade procedure runs through smoothly

Actual behaviour

  • Exception: Database error when running migration latest for app user_ldap
  • in the log we find: SQLSTATE[42704]: Undefined object: 7 ERROR: index "primary" does not exist"

Background

  • The issue lies within https://github.com/nextcloud/server/blob/master/apps/user_ldap/lib/Migration/Version1130Date20211102154716.php#L107-L108
  • There is no index called «primary», to resolve this the second line has to provide the existing name of the private key, which is oc_ldap_group_mapping_pkey for the table in question. Because when it is not the case, Doctrine will choose to drop "primary"
  • It is fruitless nevertheless, because the index cannot be dropped:
    • SQLSTATE[2BP01]: Dependent objects still exist: 7 ERROR: cannot drop index oc_ldap_group_mapping_pkey because constraint oc_ldap_group_mapping_pkey on table oc_ldap_group_mapping requires it HINT: You can drop constraint oc_ldap_group_mapping_pkey on table oc_ldap_group_mapping instead.
    • Removing line 107 does not help, for n index with name 'oc_ldap_group_mapping_pkey' was already defined on table 'oc_ldap_group_mapping'.
    • At the moment Doctrine does not support removing primary key constraints. This may be added, my naive attempts so far were not successful.
      • Upstream issue: doctrine/dbal#2925
  • Sqlite is not affected, MySQL and Oracle i have not tested.

@skjnldsv imo this is a release blocker

cc @nickvergessen @come-nc

Yeah you can not remove primary keys and can not add autoincrement in hindsight.
So make a new table and copy over the content and in migration 2 delete the old table.

While on it let’s try to make the method internal or so, so people see something is wrong with it.

Is it an easy way to easily fix the migration manually, before the next RC ?
My instance has been broken for twelve days by this bug, now.

Этой информации недостаточно для оказания какой-либо помощи с нашей стороны. Вам придется продолжить отладку, возможно, с трассировкой и сбросом объекта diff схемы.

Закрытие как invalid

Покопались в проблеме немного глубже. Я действительно могу попытаться это исправить. Похоже, что каждый раз, когда изменяется первичный ключ (стандартная последовательность, автоинкремент в / из guid), возникает проблема с получением метаданных таблиц (первичные ключи / имя индекса). Я собираюсь попробовать это самостоятельно и посмотреть, смогу ли я найти решение

@Ocramius, это определенно

  • Добавьте следующую сущность и создайте свою схему.
use DoctrineORMMapping as ORM;

/**
 * @ORMEntity()
 */
class Test
{
    /**
     * @ORMColumn(type="integer")
     * @ORMId()
     */
    protected $id;

    /**
     * @ORMColumn(type="integer")
     * @ORMId()
     */
    protected $test;
}
  • Затем просто удалите второй индекс и запустите обновление.
  • Эти ошибки с SQLSTATE[42704]: Undefined object: 7 ERROR: index "primary" does not exist

@johnpancoast, можете вы протестировать это? Я думаю, что это может быть проблема с DBAL.

Просто наткнулся на это, postgresql пытается удалить составной ключ и заменить его одним столбцом id, потому что мне нужно было добавить условное выражение WHERE к составному ключу

@plimpton попробуйте создать тестовый пример и новый PR только с неудачным сценарием, если можете

Я тоже могу воспроизвести эту проблему.

<?php
// bootstrap.php
require_once "vendor/autoload.php";

use DoctrineORMToolsSetup;
use DoctrineORMEntityManager;

$isDevMode = true;

$paths = array(__DIR__.'/entity');
$config = Setup::createAnnotationMetadataConfiguration($paths, $isDevMode, null, null, false);

$dbParams = array(
    'driver'   => 'pdo_pgsql',
    'user'     => 'doctrine_test',
    'password' => 'doctrine_test',
    'dbname'   => 'doctrine_test',
    'host'     => 'localhost',
    'charset'  => 'UTF8',
);

$entityManager = EntityManager::create($dbParams, $config);
<?php
// cli-config.php
use DoctrineORMToolsConsoleConsoleRunner;

require_once 'bootstrap.php';

return ConsoleRunner::createHelperSet($entityManager);
<?php
// entity/user.php
namespace Entity;
use DoctrineORMMapping as ORM;

/**
 * @ORMEntity
 */
class User
{
    /**
     * @ORMId
     * @ORMColumn(type="integer")
     * @ORMGeneratedValue
     */
   private $sapid;
}
# composer.json
{
    "name": "john/doctrine_test",
    "require": {
        "doctrine/orm": "*"
    }
}

(создайте пользователя и базу данных postgresql, см. dbParams)

composer install
vendor/bin/doctrine orm:schema-tool:update --force

Обновление схемы базы данных …
Схема базы данных успешно обновлена! Выполнено «2» запросов

(переименуйте sapid первичного ключа во что-нибудь другое)
vendor/bin/doctrine orm:schema-tool:update --force

Обновление схемы базы данных …
[Доктрина DBAL Exception DriverException]
Возникла исключительная ситуация при выполнении DROP INDEX «primary»:
SQLSTATE [42704]: Неопределенный объект: 7 ОШИБКА: индекс «первичный» не существует

vendor/bin/doctrine orm:schema-tool:update --dump-sql

DROP INDEX «первичный»;
ИЗМЕНИТЬ ТАБЛИЦУ «Пользователь» ПЕРЕИМЕНОВАТЬ КОЛОНКУ sapid НА sapid2;
ИЗМЕНИТЬ ТАБЛИЦУ «Пользователь» ДОБАВИТЬ ПЕРВИЧНЫЙ КЛЮЧ (sapid2);

У меня такая же ошибка при использовании Doctrine + Oracle при изменении составного ключа.

@Ocramius , не могли бы вы снова открыть этот выпуск?

Как уже дважды просили, нужен тестовый пример. Выше приведены примеры.

Извиняюсь за то, что не смог написать этот тестовый пример, но у меня сейчас нет времени из-за других проектов (типичная история, я знаю). Его легко воспроизвести, выполнив шаги iirc. К сожалению, это все, что я могу предложить на данный момент.

Есть новости по этому поводу? Я борюсь с этой проблемой.

Есть новости по этому поводу? Я борюсь с этой проблемой.

Здравствуйте, у меня была такая же проблема; Я просто вручную отбрасываю сущность (таблицу базы данных), в которой вам нужно изменить индексы (например, DROP INDEX actual_pk), а затем повторно запускаю обновление доктрины или запрос.

Как уже дважды просили, нужен тестовый пример. Выше приведены примеры.

Эх, примером может быть новая установка проекта Symfony с использованием Postgres. Ничего особенного делать не надо. Это просто происходит из коробки. Даже не нужно отбрасывать индексы. Просто измените сущность, сгенерируйте миграцию и все готово.

https://github.com/doctrine/dbal/pull/3936 решает проблему (сборки были зелеными, а тесты oo), но это довольно большое изменение и, вероятно, должно быть разделено на 2 или 3 разных запроса на перенос.
Кто-нибудь хочет помочь?

Была ли эта страница полезной?

0 / 5 — 0 рейтинги

alu

Сообщения: 16
Зарегистрирован: 2011.10.26, 09:55
Контактная информация:

Ошибка с Postgresql

Есть БД на Постгресе, создал модель и контроллер через gii
таблица на странице Manage отображается, но не работает поиск, Алертом выдает ошибку

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

Error 500: <h1>CDbException</h1>
<p>CDbCommand failed to execute the SQL statement: SQLSTATE[42703]: Undefined column: 7 ERROR:  column "country" does not exist
LINE 1: SELECT COUNT(*) FROM "Countries" "t" WHERE Country LIKE '%A%...
                                                   ^. The SQL statement executed was: SELECT COUNT(*) FROM "Countries" "t" WHERE Country LIKE :ycp0 (/xxx/framework/db/CDbCommand.php:528)</p><pre>#0 /xxx/framework/db/CDbCommand.php(425): CDbCommand->queryInternal('fetchColumn', 0, Array)
#1 /xxx/framework/db/ar/CActiveRecord.php(1536): CDbCommand->queryScalar()

Суть ошибки в том, что название поля не заключается в двойные кавычки («), а для Постгреса это обязательно. Те вместо запроса
SELECT COUNT(*) FROM «Countries» «t» WHERE Country LIKE ‘%A%…

должен быть запрос
SELECT COUNT(*) FROM «Countries» «t» WHERE «Country» LIKE ‘%A%…

Что делать и как быть? в интернете решений особо не нашел. :?: :?: :?:

niklazer

Сообщения: 1
Зарегистрирован: 2012.02.02, 23:03

Re: Ошибка с Postgresql

Сообщение

niklazer » 2012.07.07, 20:58

На мой взгляд, самое простой вариант решения — избавиться от необходимости ставить кавычки. Их использование не является обязательным для postgresql (как и для длбой другой СУБД). Дело в том, что IDE (например EMS SQL Manager) для postgresql могут при создании таблиц через визуальный интерфейс формировать DDL с использованием кавычек:
create table «Table» (
«Id» serial primary key,
«Caption» varchar(512)
);
Такой скрипт лучше заменить на следующий:
create table Table1 (
Id serial primary key,
Caption varchar(512)
);
В этом случае при формировании запроса будет неважен регистр именования полей.

alu

Сообщения: 16
Зарегистрирован: 2011.10.26, 09:55
Контактная информация:

Re: Ошибка с Postgresql

Сообщение

alu » 2012.07.09, 06:58

niklazer писал(а):На мой взгляд, самое простой вариант решения — избавиться от необходимости ставить кавычки. Их использование не является обязательным для postgresql (как и для длбой другой СУБД). Дело в том, что IDE (например EMS SQL Manager) для postgresql могут при создании таблиц через визуальный интерфейс формировать DDL с использованием кавычек:
create table «Table» (
«Id» serial primary key,
«Caption» varchar(512)
);
Такой скрипт лучше заменить на следующий:
create table Table1 (
Id serial primary key,
Caption varchar(512)
);
В этом случае при формировании запроса будет неважен регистр именования полей.

Таблицы уже были созданы давно и залезать в их структуру (заноно их создавать) это плохая идея, слишком много данных и завязки там сложные.
Выход вообще есть другой? Просто нужно чтобы все поля и таблицы в запросах поиска и во всех остальных ставились в кавычках, иначе ничего работать не будет

alu

Сообщения: 16
Зарегистрирован: 2011.10.26, 09:55
Контактная информация:

Re: Ошибка с Postgresql

Сообщение

alu » 2012.07.09, 07:50

Может, как-то можно определить список имен полей, как их надо использовать в запросах?

alu

Сообщения: 16
Зарегистрирован: 2011.10.26, 09:55
Контактная информация:

Re: Ошибка с Postgresql

Сообщение

alu » 2012.07.09, 08:53

Причем в самой медели поля rawName Описаны правильно
[Country] => CPgsqlColumnSchema Object
(
[name] => Country
[rawName] => «Country»
Так почему же она их не использует?

alu

Сообщения: 16
Зарегистрирован: 2011.10.26, 09:55
Контактная информация:

Re: Ошибка с Postgresql

Сообщение

alu » 2012.07.09, 11:12

Для поиска проблема снята!
просто в Модели нужно было прописать поля для поиска в кавычках
public function search()
…..
$criteria->compare(‘«Country»‘,$this->Country,true);
…..

и вроде поиск работает нормально, дальше посмотрим что где всплывет еще.

flame

Сообщения: 7
Зарегистрирован: 2013.01.21, 09:05

Re: Ошибка с Postgresql

Сообщение

flame » 2013.04.02, 12:00

Товарищи, столкнулся с данной проблемой. Запись названия полей таблицы в двойные кавычки в методе search, не исправило ошибку. Какие есть еще варианты решения ошибки для работы с PostgreSQL ?

Моя проблема заключается в следующем.

После удаления нескольких строк из таблицы вставка новой записи в ту же таблицу приводит к ошибке.

Database Error
Error: SQLSTATE[42P01]: 
Undefined table: 7 ERROR: relation "order_details_id_seq" does not exist

Настольные

CREATE TABLE schema.order_details (
    id serial NOT NULL,
    order_id integer NOT NULL,
    field_1 integer,
    field_2 real,
    field_3 character varying(15),
    CONSTRAINT order_details_pkey PRIMARY KEY (id )
)
WITH (
    OIDS=FALSE
);

Вставка

INSERT INTO "schema"."order_details" ("order_id", "field_1", "field_2", "field_3")
VALUES (37, 1, 2, 'value');

Последовательность «schema». «order_details_id_seq» в используемой схеме существует.

CREATE SEQUENCE schema.order_details_id_seq
    INCREMENT 1
    MINVALUE 1
    MAXVALUE 9223372036854775807
    START 37
    CACHE 1;

Модели.

// Model
class Order extends AppModel {
public $useDbConfig = 'other_data';
public $hasMany = array(
    'OrderDetail' => array(
        'className' => 'OrderDetail',
        'foreignKey' => 'order_id',
        'dependent' => true,
        'order' => array(
                      'OrderDetail.order_id',
                      'OrderDetail.field_1'
                     ))
);

class OrderDetail extends AppModel {
public $useDbConfig = 'other_data';
public $belongsTo = array(
    'Order' => array(
        'className' => 'Order',
        'foreignKey' => 'order_id',
        'dependent'    => true
    ),

// model Order save code on recreation of order
$this->OrderDetail->deleteAll(array('OrderDetail.order_id' => $this->id));

В этот момент попытался вставить $this->OrderDetail->query('VACUUM FULL ANALYZE order_details'); без эффекта

foreach ($details as $d) {
    $this->OrderDetail->create();
    $this->OrderDetail->save($d /*array(
        'order_id' => $this->id,
        'field_1' => 1, 
        'field_2' => 2, 
        'field_3' => 'value'
      )*/);
}

Я получаю сообщение об ошибке в первом цикле foreach. Самое странное, что проблема появляется и исчезает через некоторое время случайным образом.

Есть предложения, что это может быть и как от этого избавиться?


На данный момент проблема решена с помощью кода.

$this->Order->id = $id;
$this->Order->delete();

Он запускает 2 запроса для каждой строки (100 дополнительных в моем случае!) Операторов удаления вместо двух в случае

$this->OrderDetail->deleteAll(array('OrderDetail.order_id' => $id));

Так что на этот раз у него есть место для улучшения.

EDIT: В настоящее время код работает как следует с измененным DboSource.

Понравилась статья? Поделить с друзьями:
  • Undefined external error как исправить
  • Undefined external error fl studio
  • Undefined error telegram
  • Undefined error network error traceid не указан
  • Undefined error log