【问题标题】:Double quotes problems with PostgresPostgres的双引号问题
【发布时间】: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'

我的问题是:

  1. 为什么用户表被重命名为“用户”(带引号)
  2. 为什么将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 字段本身并不映射到数据库字段。事实上,很多包都有字段,例如数据库中的两个或三个字段,反之亦然。

标签: sql django database postgresql


【解决方案1】:

在阅读了有关 Stackoverflow 的几个答案后,我认为创建“用户”表而不是用户(不带引号)的原因是因为用户是 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 2022-10-17
    • 2011-01-03
    相关资源
    最近更新 更多