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

aelbi1ox  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(2)|浏览(381)

WPF PostgreSQL 11.1

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

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

<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中,在Phoenix模式中:

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表没有问题:

select * from phoenix.testme;

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

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”被执行,当我收到上述错误。注意:来自“show search_path”的ss正确返回“phoenix”
我做错了什么?我怎么才能让它工作??
任何帮助是最感激的?

ni65a41a

ni65a41a1#

在绞尽脑汁之后,答案变得不言自明。首先,我重置了数据库中的search_path。这并没有帮助。然后我用PetaPoco重建了POCO,很快发现不仅没有创建新表“testme”,而且也没有创建任何POCO。因此,检查一下,PetaPoco中的www.example.com文件显示它具有错误的ConnectionStringName。Database.tt file in PetaPoco showed it to have the wrong ConnectionStringName. Changing the ConnectionStringName to "phoenixconnection" allowed building the POCO's, but again failed to find the "testme" table.
然后错误变得显而易见,如上所述,“phoenixconnection”和“localconnection”都指向同一端口。在以前的开发中,我让PostgreSQL v10.1运行在与更新的PostgreSQL v11.1相同的端口上。显然,第一个PostgreSQL v10.1正在接收连接(而不是更新的PostgreSQL v11.1)。
转到services(services.msc)并关闭v10.1并运行Database.TT现在会出现错误:System. InvalidOperationException:序列包含多个匹配元素
显然v10.1(我用于开发)只有一个模式,但v11.1有多个模式。我认为错误消息意味着PetaPoco看到了多个具有相同表名的表--也就是说,它没有区分模式。
所以,问题现在解决了。
1.修好港口!旧的单模式PostgreSQL v10.1保留在端口:5432。较新的多模式PostgreSQL保存在端口5433上。v10.1将用于POCO。
1.修复WCF的App.config中的连接字符串,以便在运行时,WCF将使用较新的v11.1。一旦生成,就不要去管POCO,而是在WCF文件中引用它们。
显然,PetaPoco只能使用一种模式来生成它的POCO,但是在运行时,它将从WCF的App.config读取连接字符串来执行它的查询,等等。(因此,在Database.TT所在的App.config中,将PetaPoco指向只有一个模式的"开发"数据库,但在WCF环境中,将连接字符串指向具有多个模式的新数据库。连接字符串IS的SearchPath在通过Npgsql运行时受到尊重)。
如果PetaPoco能够在多模式环境中生成特定于模式的POCO,那就太好了,但目前,我想它还不能:(
附录注解:事实证明,一个给定的PostgreSQL示例可以有 * 多个**DATABASE *。因此,如果Npgsql的连接字符串特定于开发数据库--即只有一个模式的数据库--那么在开发期间,PetaPoco可以很好地创建POCO。这些POCO可以直接用于WCF服务项目并上传到IIS网站。然后,网站的App.config文件可以被定向为使用运行时数据库(同样在连接字符串中)到部署的数据库。一切都很好!:)

tquggr8v

tquggr8v2#

我已经通过以下方式从MSSQLserver迁移了表和dbo模式
x1c 0d1x步骤1.在PostgreSQL中通过查询创建搜索路径,如下所示

SET search_path = 'dbo,public';

步骤2.添加连接字符串,如下例所示
“DefaultConnection”:“服务器=localhost; Port=5432;Database=dbname;用户ID=Admin;密码=df@34%dfd; return true; public String s,String s;“
注意我在下面指定的搜索路径

相关问题