在PostgreSQL中使用多个架构时找不到表

时间:2019-01-31 00:27:21

标签: postgresql npgsql petapoco

WPF PostgreSQL 11.1

Npgsql.PostgresException:'42P01:关系“ testme”不存在”

当尝试使用具有多个架构的PostgreSQL数据库时,我在App.config中定义了以下连接字符串。请注意,唯一的区别在于SearchPath:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.min.js"></script>

<div id ="page">
   <div class = "notification">NOTIFICATION</div>
   <div id = "header">HEADER</div>
   <div id="content"></div>
</div>
  

使用NuGet安装了Npgsql数据提供程序:运行时版本:   v4.0.30319版本:4.0.4.0

在PostgreSQL的Phoenix模式中:

 <system.data>
    <DbProviderFactories>
      <add name="Npgsql Data Provider" invariant="Npgsql" support="FF" description=".Net Framework Data Provider for Postgresql Server" type="Npgsql.NpgsqlFactory, Npgsql, Version=4.0.4.0, Culture=neutral" />
    </DbProviderFactories>
  </system.data>
  <connectionStrings>
    <clear />
    <add name="localconnection" providerName="Npgsql" connectionString="Server=127.0.0.1;Port=5432;Database=chaos;User Id=postgres;Password=****;Searchpath=nova" />
    <add name="phoenixconnection" providerName="Npgsql" connectionString="Server=127.0.0.1;Port=5432;Database=chaos;User Id=postgres;Password=****;SearchPath=phoenix;" />
  </connectionStrings>

使用PgAdmin,显示testme表可以正常工作:

CREATE TABLE phoenix.testme
(
    name text COLLATE pg_catalog."default" NOT NULL
)
WITH (
    OIDS = FALSE
)
TABLESPACE pg_default;

ALTER TABLE phoenix.testme
    OWNER to postgres;

我已经使用上述连接字符串配置了WCF服务。使用PetaPoco,我编写了以下脚本:

select * from phoenix.testme;

当我收到上述错误时,所有操作正常,直到执行“从testme中选择*”为止。注意:“ show search_path”中的ss正确返回“ phoenix”

我在做什么错?我如何使它工作?

最能帮助您吗?

1 个答案:

答案 0 :(得分:0)

经过反复摸索,答案变得不言而喻。首先,我不得不重置SEARCH_PATH在数据库中。这没有帮助。然后我重建了POCO与PetaPoco并很快发现,不仅是新表,“TESTME”,没有创造,但也没有任何POCO的。所以,检查,在PetaPoco的Database.tt文件表明,它有错误的connectionStringName。改变的connectionStringName为“phoenixconnection”允许建设POCO的,但还是没有找到“TESTME”表。

然后,错误变得显而易见,如上所述,“ phoenixconnection”和“ localconnection”都指向同一端口。在以前的开发中,我使PostgreSQL v10.1与较新的PostgreSQL v11.1在同一端口上运行。显然,第一PostgreSQL的10.1被接收到连接(而不是较新的PostgreSQL V11.1)。

现在转到服务(services.msc)并关闭v10.1并运行Database.TT时出现错误:        System.InvalidOperationException:序列包含多个匹配元素

显然,v10.1(我用于开发)只有一个模式,但是v11.1具有多个模式。我认为错误消息的意思是PetaPoco看到多个具有相同表名的表-即它没有区分模式。

因此,现在的问题得到解决。

  1. 修复端口!年长的单模式的PostgreSQL 10.1保持端口:5432。 较新的多模式PostgreSQL保留在端口5433上。v10.1将用于POCO。
  2. 修复WCF的App.config中的连接字符串,以便在运行时WCF将使用较新的v11.1。生成后,仅保留POCO,并在WCF文件中引用它们。

显然,PetaPoco在生成其POCO时只能使用一种模式,但是在运行时将从WCF的App.Config中读取连接字符串以执行其查询等。(因此,在App.config中,数据库.TT驻留,将PetaPoco指向仅具有一个模式的“开发”数据库,但是在WCF环境中,将连接字符串指向具有多个模式的新数据库。连接字符串 IS 通过Npgsql运行时受尊重)。

如果PetaPoco可以在多模式环境中生成特定于模式的POCO,那就太好了,但是目前,我想它不能:(

附录注:原来,PostgreSQL的的给定实例可具有多个 数据库。因此,如果Npgsql的连接字符串特定于开发数据库(即仅具有一个架构的数据库),那么在开发期间,PetaPoco可以很好地创建POCO。这些POCO可以直接在WCF服务项目中使用,并上传到IIS网站。然后,可以将网站的App.config文件定向为将运行时数据库(同样在连接字符串中)用于已部署的数据库。一切正常! :)