c#, PostgreSQL在输入结束时出现语法错误



我似乎不能用最简单的sql创建迁移来创建PostgreSQL过程。

错误是:

异常数据:严重性:错误SqlState: 42601MessageText:输入结束时出现语法错误位置:186文件:scan.l线:1184常规:scanner_yyerror

Sql代码在pgAdmin中执行时工作正常。

protected override void Up(MigrationBuilder migrationBuilder)
{
var sp = @"CREATE PROCEDURE reset_primary_holder()
LANGUAGE SQL
BEGIN ATOMIC
SELECT * FROM id.users;
END;";
migrationBuilder.Sql(sp);
}
What am I doing wrong?

Npgsql (. NET驱动程序(不是EF提供程序)默认解析SQL以查找分号和重写语句,而新的PostgreSQL语法打破了解析器;参见https://github.com/npgsql/npgsql/issues/4445。

一般建议的修复方法是在程序的开头添加以下内容:
AppContext.SetSwitch("Npgsql.EnableSqlRewriting", false);

禁用语句解析/重写;这意味着您需要使用位置参数占位符($1,$2而不是@p1,@p2) -参见文档。

然而,不幸的是,EF还不兼容这种模式,所以你必须不使用这种语法…

最后唯一可行的解决方案是使用不同的语法:

protected override void Up(MigrationBuilder migrationBuilder)
{
var sp = @"CREATE PROCEDURE my_procedure()
AS $$
UPDATE id.users
SET ...;
Another statement;
$$ LANGUAGE sql;";            
migrationBuilder.Sql(sp);
}

这个语法在存储过程的文档中没有提到,因为这是我的第一个PG过程/函数,所以对我来说没有明显的替代方法。

谢谢@Shay给我指出了正确的方向。

相关内容

  • 没有找到相关文章

最新更新