FluentMigrator Postgres(Npgsql)引号

4

如果使用FluentMigrator与PostgreSQL,它会生成以下代码:

CREATE TABLE public."Sample"...

由于这个原因,我必须为每个序列使用双引号。
SELECT * FROM public.Sample <--- Error
SELECT * FROM public."Sample" <--- OK

我该如何关闭双引号?

更多详细信息请参见https://github.com/schambers/fluentmigrator/issues/687


2
最简单的方法是避免混用大小写标识符。 (在SQL中,除非加上引号,否则标识符不区分大小写) - joop
5个回答

2
我已经自己查看了这个问题,问题在于FluentMigrator基本上硬编码了引号,根据当前版本。唯一的解决方法是下载并修改源代码。它非常好制作,您需要查看PostgresQuoter.cs类,并覆盖一些基本引用方法。我没有完全修改整个项目,只能在第一次通过时工作,并希望在本周晚些时候完成其余更改。如果不太糟糕,我将尝试提供要修改的文件。

2
在最新版本3.3.2中,您可以通过PostgresOptions的"Force Quote"参数禁用引用,但令人烦恼的是它默认为'true',但可以关闭。用于关闭此行为的dotnet fm工具的参数为:--processor-switches "Force Quote=false"。请参见https://github.com/fluentmigrator/fluentmigrator/blob/v3.3.2/src/FluentMigrator.Runner.Postgres/Processors/Postgres/PostgresOptions.cshttps://fluentmigrator.github.io/articles/runners/dotnet-fm.html#-s--processor-switches-processor_switches。在配置运行器时,在IDBMigrationRunner实例上设置ProcessorOptions也可以使用"in-process"方法完成。
        return new ServiceCollection()
            .AddFluentMigratorCore()
            .ConfigureRunner(rb => rb
                .AddPostgres()
                // ...
                .ConfigureGlobalProcessorOptions(opt =>
                {
                    opt.ProviderSwitches = "Force Quote=false";
                })
                // ...

背景信息请参见:

https://fluentmigrator.github.io/articles/migration-runners.html?tabs=vs-pkg-manager-console

(Note: 本文链接为英文网页,需要使用翻译工具将其翻译为中文)

1
这只是一个问题,如果您没有始终使用小写。Postgres区分大小写。当未加引号时,Postgresql对标识符不区分大小写(实际上在内部将它们折叠为小写),并且在引用时区分大小写。始终使用小写就安全了。但是,如果您使用camelCase或PascalCase,则意味着您需要始终保持一致:要么始终引用标识符,要么从不引用。

换句话说,如果您使用小写作为约定来命名事物,您将不会遇到双引号的问题。如果您使用大写,您将无法避免双引号的问题。希望这可以帮助您。祝您的项目顺利。 :)


0

我自己遇到了这个问题,其他人也提到过,但我想再强调一下,并且特别澄清一下,尤其是如果你是从SQL Server转过来的。

首先,如果你不混合使用不同的数据库,只使用PG,那么最简单的解决方法就是不要使用大小写混合!只需将所有内容都变成小写即可。

例如:

Create.Table("users")

现在查询时,您可以执行以下任何操作

select * from users
select * from Users
select * from USERS

它们都做同样的事情。

你也需要对列进行这样的操作。

PG之所以有引号,是因为它支持引用符号的概念,必须完全匹配大小写。

可能在FluentMigrator中有一个钩子,可以强制使用小写(即只需.ToLower()所有名称)。


0

如果你想完全摆脱双引号,那么:

  1. PostgresQuoter创建派生类

    public class NoQuoteQuoter : PostgresQuoter
    {
        public NoQuoteQuoter(PostgresOptions options) : base(options)
        {
        }
        protected override bool ShouldQuote(string name)
        {
            return false;
        }
    }
    
  2. 通过依赖注入将其添加到启动项

    return new ServiceCollection()
        .AddScoped<PostgresQuoter, NoQuoteQuoter>()
    

由于某种原因,这样做也会导致它无法看到表是否已经被创建。 - misha130

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接