Postgres的双引号问题

Posted

技术标签:

【中文标题】Postgres的双引号问题【英文标题】:Double quotes problems with Postgres 【发布时间】:2020-07-18 15:53:20 【问题描述】:

我正在使用带有 postgres 的 Django。这是我用来在数据库中创建表的代码的 sn-p。

class user(models.Model):
    user_id = models.IntegerField(primary_key=True)
    username = models.CharField(max_length=30)
    password = models.CharField(max_length=30)
    role_id = models.ForeignKey(role,on_delete=models.CASCADE)
    class Meta:
        db_table = 'user'

我的问题是:

    为什么用户表被重命名为“用户”(带引号) 为什么将role_id 命名为role_id_id,而我已经明确提到role_id 是我的列名?

【问题讨论】:

如果您使用ForeignKey,那么它将创建一个名为field_id 的“双字段”,其中包含主键,这就是您使用_id 后缀在 ForeignKey 字段中。 表名两边的双引号是为了保护大小写敏感。 python 字符串区分大小写,但没有引号将在 postgres 中小写。它不会影响任何事情,您无需担心。 双引号不是必需的,但不会对您的情况造成任何伤害。如果表格有大写字符,则需要引号来保留它们。否则查询解析器会将所有字符转换为小写。 @Willem Van Onsem。 Django 不会创建“双字段”,每个关系只有一个 FK 字段。 Django 在创建表时只是将模型中的任何字段名称附加到“_id”,除非您使用db_column 覆盖。此外,该字段不包含 PK,因为您可以在 FK 中有重复的条目。此外,FK 不必指向 PK 字段,只需指向 UNIQUE @AdrianKlaver:不,事实上你甚至可以分配给那个字段,例如user.role_id_id=4ForeignKey 没有保存在数据库中,因为数据库实际上并没有 ForeignKey 字段,但它也创建了一个可以接受值的具有相同类型的字段。请注意,model 字段本身并不映射到数据库字段。事实上,很多包都有字段,例如数据库中的两个或三个字段,反之亦然。 【参考方案1】:

在阅读了有关 *** 的几个答案后,我认为创建“用户”表而不是用户(不带引号)的原因是因为用户是 postgres 中的保留关键字,不能用于表名。 来到关于_id部分的第二个问题:

Behind the scenes, Django appends "_id" to the field name to create
its database column name.

【讨论】:

所有的努力都投入到了文档FK 并且没有阅读它们:“在幕后,Django 将“_id”附加到字段名称以创建其数据库列名称。在上面的示例中,数据库Car 模型的表将有一个manufacturer_id 列。(您可以通过指定db_column 显式更改此列)"【参考方案2】:

问题是您的应用名称包含大写字母,您的应用名称必须全部小写

例子:

应用名称:Main_app + 表名称:用户 --> 数据库表:"Main_app.user"

应用名称:main_app + 表名称:用户 --> 数据库表:main_app.user

【讨论】:

以上是关于Postgres的双引号问题的主要内容,如果未能解决你的问题,请参考以下文章

用R中的双引号替换转义的双引号

循环遍历双引号但忽略单引号中的双引号

单引号中的双引号,反之亦然

PHP中的双引号和单引号的应用

JavaScript中的双引号与单引号[重复]

单引号字符串中的双引号 - NodeJs