查询坚持引用列

Query insists on quoted columns

我有一个 Postgres 运行ning 的本地副本,我正在使用 nHibernate 作为 ORM 开发 C# .Net Core 2.1 应用程序。

开始抛出异常:PostgresException: 42703: column this_.datasetname does not exist

当我在 pgAdmin 中复制 SQL 和 运行 时,我得到了类似的错误。

这是 SQL 的简短版本,它给出了相同的错误:

SELECT this_.datasetName FROM orders this_

ERROR: column this_.datasetname does not exist LINE 1: SELECT this_.datasetName FROM orders this_ ^ HINT: Perhaps you meant to reference the column "this_.datasetName". SQL state: 42703 Character: 8

如果我在列名称周围添加引号(但不是按照建议在 _this. 周围添加引号)它会起作用,但显然我不能告诉 nHibernate 这样做。

SELECT this_."datasetName" FROM orders this_

以下也可以正常工作:

SELECT "datasetName" FROM orders

为什么要坚持加引号?从来没有。

这是因为此列首先是用双引号引起来的 - 这使得标识符区分大小写,而默认情况下则不区分大小写。由于标识符包含大小写混合,你被卡住了:标识符需要在你使用它的任何地方引用。

如果您查看 table 的定义,您会看到如下内容:

create table orders (
    ...,
    "datasetName" text,
    ...
)

我强烈建议修复您的架构。带引号的标识符通常不会增加任何价值,而另一方面它们会使事情不必要地复杂化。 Camel case 不能很好地填充数据库标识符,snake case 更好,因为 case 没有意义:

create table orders (
    ...,
    dataset_name text,
    ...
)