FluentMigrator Postgres(Npgsql)引用

时间:2016-02-19 11:02:43

标签: postgresql double-quotes npgsql fluent-migrator

如果使用带有postgres的fluentmigrator,它会生成像这样的代码

CREATE TABLE public."Sample"...

因为这个我必须为每个序列使用双引号

SELECT * FROM public.Sample <--- Error
SELECT * FROM public."Sample" <--- OK

我如何关闭双引号?

更多信息说明https://github.com/schambers/fluentmigrator/issues/687

4 个答案:

答案 0 :(得分:2)

我自己看过这个问题,问题是FluentMigrator的引号基本上是硬编码的.....根据当前版本。

唯一的方法是自己下载和修改源代码。

它非常好,你需要查看PostgresQuoter.cs类,并覆盖一些基本的引用方法。

我还没有完全修改整个项目,只适用于第一遍,并希望在本周晚些时候完成其余的更改。 如果它不是太hacky我会看到是否不能给你修改文件。

答案 1 :(得分:0)

如果你不是一直使用小写,这真的只是一个问题。 Postgres区分大小写。 Postgresql在没有引用的情况下对标识符不区分大小写(它实际上将它们在内部折叠为小写),并且在引用时区分大小写。使用小写字母是安全的。但是,如果您使用的是camelCase或PascalCase,则意味着您始终需要保持一致:始终或永远不会引用标识符。

重申,如果您使用小写作为约定命名事物,则不会出现双引号问题。如果你使用大写,你会遇到双引号问题。希望这可以帮助。祝你的项目好运。 :)

答案 2 :(得分:0)

如果您想完全消除双引号,则:

  1. dt = datetime.datetime.fromisoformat(calendar['Start'][i]) hours = dt.hour

    创建派生类
    PostgresQuoter
  2. 通过依赖项注入将其添加到启动

    public class NoQuoteQuoter : PostgresQuoter
    {
        public NoQuoteQuoter(PostgresOptions options) : base(options)
        {
        }
        protected override bool ShouldQuote(string name)
        {
            return false;
        }
    }
    

答案 3 :(得分:0)

我自己也遇到了这个问题,很多其他人都提到过这个问题,但是我想重申这一点,尤其是如果您来自SQL Server,则还要澄清一下。

首先,如果您不混合使用其他数据库,而仅使用PG,则使用EASIEST方式可以解决问题。 不要使用大小写混合!只需将所有内容都变成小写

例如

Create.Table("users")

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

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

他们都做同样的事情。

您还需要对列进行此操作。

PG带有引号的原因是它支持必须与外壳完全匹配的带引号的符号

在FluentMigrator中可能存在一个钩子,您可以在其中强制使用小写字母(即,仅使用.ToLower()所有名称)