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=4
。 ForeignKey
没有保存在数据库中,因为数据库实际上并没有 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的双引号问题的主要内容,如果未能解决你的问题,请参考以下文章