首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在PostgreSQL中使用多个模式时找不到表

在PostgreSQL中使用多个模式时找不到表
EN

Stack Overflow用户
提问于 2019-01-31 00:27:20
回答 1查看 507关注 0票数 1

WPF PostgreSQL 11.1

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

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

代码语言:javascript
运行
复制
 <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>

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

在PostgreSQL中,在凤凰模式中:

代码语言:javascript
运行
复制
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;

使用PgAdmin,显示testme表没有问题:

代码语言:javascript
运行
复制
select * from phoenix.testme;

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

代码语言:javascript
运行
复制
public string SayHello()
    {
        string msg;
        using (var db = new chaosDB("phoenixconnection"))
        {
            var m = db.ExecuteScalar<string>("select version()");
            msg = string.Format("Hello from {0}", m);

            m = db.ExecuteScalar<string>("select current_schema");
            msg = string.Format("{0} Current Schema is {1}", msg, m);

            var ss = db.ExecuteScalar<string>("show search_path");


            var s = db.Fetch<string>("select * from testme"); <---THIS FAILS!
            msg = string.Format("{0} I Am {1}", msg, m);

        }
        return msg;
    }

当我收到上述错误时,所有操作都是正确的,直到执行"select * from testme“为止。注: ss从“显示search_path”返回正确的“凤凰”

我做错什么了?我怎么才能让这个起作用??

有什么帮助是最感谢的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-31 20:02:23

绞尽脑汁之后,答案变得不言自明了。首先,我在数据库中重置了search_path。这没什么用。然后,我用PetaPoco重新构建了POCO,很快就发现,不仅新表"testme“没有创建,而且没有任何POCO表。所以,检查一下,PetaPoco中的Database.tt文件显示它的ConnectionStringName是错误的。将ConnectionStringName更改为"phoenixconnection“允许构建POCO,但再次找不到"testme”表。

然后,如前所述,错误变得显而易见,"phoenixconnection“和"localconnection”都指向同一个端口。从以前的开发开始,我让PostgreSQL v10.1运行在与更新的PostgreSQL v11.1相同的端口上。显然,第一个PostgreSQL v10.1正在接收连接(而不是更新的PostgreSQL v11.1)。

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

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

所以,问题现在已经解决了。

  1. 修理港口!旧的单模式PostgreSQL v10.1保存在端口5432上。较新的多模式PostgreSQL保存在端口5433上。v10.1将用于POCO。
  2. 修复WCF的App.config中的连接字符串,以便在运行时,WCF将使用更新的v11.1。一旦生成,就不要使用POCO,并在WCF文件中引用它们。

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

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

增编注:事实证明,给定的PostgreSQL实例可以有多个数据库。因此,如果Npgsql的连接字符串特定于开发数据库--即只有一个模式的数据库--那么在开发期间,PetaPoco可以很好地创建POCO。这些POCO可以直接用于website项目并上传到IIS网站。然后,可以将网站的App.config文件定向到已部署数据库的运行时数据库(同样在连接字符串中)。一切都很好!)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54451646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档