Getting an error on generating some Identity Framework tables:
fail: Microsoft.EntityFrameworkCore.Database.Command[20102]
Failed executing DbCommand (14ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
CREATE TABLE "AspNetRoleClaims" (
"Id" integer NOT NULL GENERATED BY DEFAULT AS IDENTITY,
"RoleId" uuid NOT NULL,
"ClaimType" text NULL,
"ClaimValue" text NULL,
CONSTRAINT "PK_AspNetRoleClaims" PRIMARY KEY ("Id"),
CONSTRAINT "FK_AspNetRoleClaims_Roles_RoleId" FOREIGN KEY ("RoleId") REFERENCES "Roles" ("Id") ON DELETE CASCADE
);
Npgsql.PostgresException (0x80004005): 42601: syntax error at or near "GENERATED"
at Npgsql.NpgsqlConnector.<>c__DisplayClass161_0.<<ReadMessage>g__ReadMessageLong|0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at Npgsql.NpgsqlConnector.<>c__DisplayClass161_0.<<ReadMessage>g__ReadMessageLong|0>d.MoveNext() in C:projectsnpgsqlsrcNpgsqlNpgsqlConnector.cs:line 1032
--- End of stack trace from previous location where exception was thrown ---
at Npgsql.NpgsqlDataReader.NextResult(Boolean async, Boolean isConsuming) in C:projectsnpgsqlsrcNpgsqlNpgsqlDataReader.cs:line 444
at Npgsql.NpgsqlDataReader.NextResult() in C:projectsnpgsqlsrcNpgsqlNpgsqlDataReader.cs:line 332
at Npgsql.NpgsqlCommand.ExecuteDbDataReader(CommandBehavior behavior, Boolean async, CancellationToken cancellationToken) in C:projectsnpgsqlsrcNpgsqlNpgsqlCommand.cs:line 1219
at Npgsql.NpgsqlCommand.ExecuteNonQuery(Boolean async, CancellationToken cancellationToken) in C:projectsnpgsqlsrcNpgsqlNpgsqlCommand.cs:line 1042
at Npgsql.NpgsqlCommand.ExecuteNonQuery() in C:projectsnpgsqlsrcNpgsqlNpgsqlCommand.cs:line 1025
at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.Execute(IRelationalConnection connection, DbCommandMethod executeMethod, IReadOnlyDictionary`2 parameterValues)
at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteNonQuery(IRelationalConnection connection, IReadOnlyDictionary`2 parameterValues)
at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationCommandExecutor.ExecuteNonQuery(IEnumerable`1 migrationCommands, IRelationalConnection connection)
at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)
[... my app here]
As far as I can tell, the GENERATED
keyword isn’t valid on Postgres 9.x, that’s a thing in 10.x. I’d just upgrade but Google Cloud SQL only supports 9.6….
Я пытаюсь выяснить, как настроить основной проект .net в Linux, используя Postgresql в качестве сервера базы данных.
Я начал с проекта по умолчанию .net core 2.2 web api, который предоставляет вам объект WeatherForecast.
Я добавил к этому идентификатор, аннотировал его ключом и произвел первоначальную миграцию;
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "WeatherForecasts",
columns: table => new
{
Id = table.Column<int>(nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
Date = table.Column<DateTime>(nullable: false),
TemperatureC = table.Column<int>(nullable: false),
Summary = table.Column<string>(nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_WeatherForecasts", x => x.Id);
});
}
Когда я пытаюсь применить миграцию, я получаю следующую ошибку;
Npgsql.PostgresException (0x80004005): 42601: syntax error at or near "GENERATED"
Ошибка говорит о том, что в базе данных есть проблема со словом «GENERATED»
Отладчик показывает точный запрос к базе данных;
CREATE TABLE "WeatherForecasts" (
"Id" integer NOT NULL GENERATED BY DEFAULT AS IDENTITY,
"Date" timestamp without time zone NOT NULL,
"TemperatureC" integer NOT NULL,
"Summary" text NULL,
CONSTRAINT "PK_WeatherForecasts" PRIMARY KEY ("Id")
);
Я открыл окно терминала и подключился к postgresql cli и напрямую попытался создать, это подтвердило, что слово GENERATED вызывало ошибку.
Любые идеи относительно того, что относится к этому GENERATED? Нужно ли устанавливать другую версию postgres? (сейчас 9.6.15)
Мой CsProj имеет следующие пакеты для Entity Framework и Postgresql;
"Microsoft.EntityFrameworkCore.Design" Version="3.0.0"
"Npgsql.EntityFrameworkCore.PostgreSQL" Version="3.0.0"
"Npgsql.EntityFrameworkCore.PostgreSQL.Design" Version="1.1.1"
Большое спасибо
2 ответа
Лучший ответ
Похоже, вы активируете функцию IDENTITY columns
, которая была представлена только в PostgreSQL 10. Я предлагаю вам перейти на более новую версию PostgreSQL.
См. https: // dba.stackexchange.com/questions/198777/how-to-add-a-postgresql-10-identity-column-to-an-existing-table
«Microsoft.EntityFrameworkCore.Design» Version = «3.0.0»
«Npgsql.EntityFrameworkCore.PostgreSQL» Version = «3.0.0»
«Npgsql.EntityFrameworkCore.PostgreSQL.Design» Version = «1.1.1» `
Кроме того, установленные вами пакеты предназначены для asp.net core 3.0, но у вас, похоже, есть проект web api asp.net core 2.2, который может не поддерживаться.
1
Ryan
30 Сен 2019 в 02:51
Если по каким-то причинам вам нравится использовать старый PostgreSQL (я лично это понимаю), вы можете указать свою версию в переопределенном методе OnConfiguring
. У меня работает отлично
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseNpgsql("Server=127.0.0.1;Port=5432;Database=fantyPayments;User Id=postgres;Password = postgres;", options =>
{
options.SetPostgresVersion(new Version("9.6"));
});
base.OnConfiguring(optionsBuilder);
}
Проверьте дополнительные параметры для класса Version
. Это может помочь вам со многими проблемами.
Ошибка с синтаксисом на этом этапе связана с большими изменениями в версии 10.*
PostgreSQL. Драйвер Npgsql по умолчанию для EF Core установлен на новейшую версию PostgreSQL.
Как писал @Xing Zou, функция IDENTITY columns
является причиной, по которой вы не можете использовать синтаксис PgSQL 10.*
в версии PgSQL 9.*
.
1
Kamil
23 Мар 2020 в 10:11
На чтение 2 мин Просмотров 714 Опубликовано 05.09.2022
Многие пользователи сталкиваются с ошибка Error syntax error at or near 1 в PostgreSQL. Уведомления о сбое в программе обычно достаточно корректны. Скорее всего причина в том, что драйвер редактирует детали. Обычно достаточно посмотреть на журнал Postgres, где присутствуют все сведения.
PostgreSQL – что это?
Реляционная система информации, помогающая пользователям упорядочить сведения и иметь общую картину об их взаимосвязи. Информационная база имеет открытый код, и ее поддержка осуществляется на протяжение 30 летнего периода с момента разработки. Она наиболее востребованная у пользователей, из аналогичных реляционных баз данных.
Как определить версию?
Чтобы узнать серверную версию следует набрать командный путь: pg_config –version. Также можно прописать: postgres -V. А чтобы определить версию клиента необходима коанда: psql –version. Альтернативное решение sudo -u postgres psql -c ‘Select version ()’ | grep PostgreSQL.
Преимущества базы
Программа популярна. Этому есть много причин:
- полноценная совместимость SQL;
- не закрытый исходный код;
- расширенные настройки, позволяющие делать личные, индивидуальные плагины и проводить персонализацию критериев;
- можно индексировать геометрические (и по географии) объекты;
- присутствуют расширения Пост GIS;
- опция MVCС, чтобы управлять параллельным доступом путем много-версионности;
- расширяемость, дающая возможность масштабировать посредством сохраняемых процессов;
- • поддержка определенного объектно-ориентированного функционала.
Помимо этого база регулярно обновляется, что также явное преимущество для пользователей.
Пуск pgAdmin-4 и подсоединение к серверной
PgAdmin-4 будет установлен совместно с базой, для его запуска следует кликнуть на «Меню Пуск затем выбрать непосредственно саму программу и уже после пгАдмин4.
Обновленная версия обладает веб-интерфейсом, потому у пользователя произойдет запуск браузера, где и откроется программа админ4.
Чтобы подключится к только что скаченному и прошедшему процесс установки локальному серверу в серверном обозревателе надо нажать на категорию «PostgreSQL-11».
В итоге будет выполнен запуск «Connect to Server», где потребуется прописать пароль системного пользователя postgres, а именно тот пароль, который был придуман пользователем во время установки программы с базой. После того как введен пароль, нужно поставить галочку «Save Password», это позволит осуществить его сохранение, после чего не потребуется вводить его при каждом входе.
Обязательно подтвердить действие кликом на «OK». В результате будет выполнено подключение к локальной серверной базы.