Sql error 42p01 error relation

Sql error 42p01 error relation

Я новичок в создании баз данных, и эта ошибка меня ошеломила, так как я новичок в администрировании БД (в основном я выполняю запросы типа отчетов). Я создал новую базу данных через графический интерфейс pgAdmin3, и я пытаюсь создать объекты БД там, используя SQL, но получаю:

ERROR: relation “replays” does not exist

SQL state: 42P01

Я просмотрел руководство, но не нашел ничего очень полезного, хотя я подозреваю, что это может быть как-то связано с search_path. Вот скриншот. Есть идеи, что я делаю не так, пожалуйста?

Ответ

Я поговорил с кем-то, кто помог мне найти ответ. Правильный синтаксис, для любого в будущем. В документации упоминается об этом, хотя это может быть легко пропустить.

START TRANSACTION;

DROP SCHEMA IF EXISTS replays CASCADE;

CREATE SCHEMA replays;

CREATE ROLE admins WITH

  PASSWORD ‘changeme’;

GRANT SELECT ON ALL TABLES IN SCHEMA replays TO PUBLIC;

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA replays TO admins;

COMMIT;

PostgreSQL ERROR: 42P01: relation “[Table]” does not exist

У меня возникла эта странная проблема с использованием PostgreSQL 9.3 с таблицами, созданными с использованием qoutes. Например, если я создаю таблицу с использованием qoutes:

create table “TEST” (“Col1” bigint);

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

select table_schema, table_name from information_schema.tables where not table_schema=’pg_catalog’ and not table_schema=’information_schema’;

Поскольку таблица была создана с кавычками, я не могу напрямую использовать имя таблицы, возвращенное из приведенного выше запроса, поскольку оно не заключено в кавычки и выдает ошибку в posted в заголовке.

Я мог бы попробовать заключить имена таблиц в кавычки во всех запросах, но я не уверен, что это будет работать постоянно. Я ищу способ получить список имен таблиц, которые заключены в кавычки в результате.

У меня такая же проблема с именами столбцов, но я надеюсь, что если я смогу найти решение проблемы с именами таблиц, аналогичное решение будет работать и для имен столбцов.

Ответ

у вас есть два варианта: – без кавычек: тогда все автоматически будет в нижнем регистре и без учета регистра – с кавычками: с этого момента все чувствительно к регистру.

я бы настоятельно рекомендовал НЕ использовать кавычки и заставить PostgreSQL вести себя без учета регистра. это делает жизнь намного проще. как только вы начнете цитировать, вы должны использовать его ВЕЗДЕ, поскольку PostgreSQL начнет быть очень точным.

некоторый пример:

  TEST = test <– non case sensitive

  “Test” <> Test <– first is precise, second one is turned to lower case

  “Test” = “Test” <– will work

  “test” = TEST <– should work; but you are just lucky.

действительно старайтесь избегать такого рода уловок любой ценой. для имен объектов используйте 7-битный ascii.

При использовании пакета npg в качестве хранилища данных ORM вы ожидаете, что платформа ORM (в нашем случае Entity Framework) сгенерирует инструкцию sql, вы можете столкнуться с исключением PostgreSQL, отношение “Имя таблицы” не существует

Либо таблица не создана, либо в сгенерированном операторе SQL чего-то не хватает. Попробуйте выполнить отладку с помощью Visual Studio, вы увидите, что имя схемы не является ведущим именем таблицы

SELECT “ID”, “Name”, “CreatedBy”, “CreatedDate”

FROM “TestTable”;

в то время как PostgreSQL ожидает имя схемы. Разрешение находится в классе DbContext переопределите метод OnModelCreating и добавьте modelBuilder.HasDefaultSchema(“SchemaName”); и запустите базовый конструктор, который должен выглядеть следующим образом

protected override void OnModelCreating(ModelBuilder modelBuilder) {

  modelBuilder.HasDefaultSchema(“PartyDataManager”);

  base.OnModelCreating(modelBuilder);

}

Наталья Петрова
Оцените автора
Новости города Салавата
Добавить комментарий

Adblock
detector