当前位置: 首页 > 知识库问答 >
问题:

使用peewee的唯一共同约束

祁兴运
2023-03-14

它的方法是应用唯一的两列约束模型使用peewee。有原始的方法(使用SQL()),但我正在寻找另一种方法。

我使用postgres,所以我试图像@booshong下面说的那样做,然后在原始SQL我给出了以下内容(为了简单起见,与事务相关的BEGINCOMMIT省略并输出):

CREATE TABLE IF NOT EXISTS "foo" (
    "id" SERIAL NOT NULL PRIMARY KEY,
    "field_1" VARCHAR(255) NOT NULL,
    "field_2" VARCHAR(255) NOT NULL);

CREATE UNIQUE INDEX IF NOT EXISTS "foo_field_1_field_2" 
    ON "foo" ("field_1", "field_2");

CREATE TABLE IF NOT EXISTS "foo2" (
    "id" SERIAL NOT NULL PRIMARY KEY,
    "field_1" VARCHAR(255) NOT NULL,
    "field_2" VARCHAR(255) NOT NULL, 
    UNIQUE (field_1, field_2));

正如我们所看到的,正如我前面所说,这是不同的事情。

共有1个答案

孟昆
2023-03-14

class Foo(BaseModel):
    field_1 = CharField()
    field_2 = CharField()

    class Meta:
        indexes = (
            (('field_1', 'field_2'), True),
        )


class Foo2(BaseModel):
    field_1 = CharField()
    field_2 = CharField()

    class Meta:
        constraints = [SQL('UNIQUE (field_1, field_2)')]


Foo.create_table()
Foo2.create_table()

-- MySQL v8

show create table foo;
>> CREATE TABLE `foo` (
  `id` int NOT NULL AUTO_INCREMENT,
  `field_1` varchar(255) NOT NULL,
  `field_2` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `foo_field_1_field_2` (`field_1`,`field_2`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci


show create table foo2;
>> CREATE TABLE `foo2` (
  `id` int NOT NULL AUTO_INCREMENT,
  `field_1` varchar(255) NOT NULL,
  `field_2` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `field_1` (`field_1`,`field_2`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

这两个表是等效的。

 类似资料:
  • 问题内容: 如何在hibernatePOJO上实现我的唯一约束?假设数据库不包含任何内容。 我在注解中看到了唯一属性,但无法正常工作吗? 如果我想将此约束应用于多个列怎么办? 问题答案: 基本上,没有数据库支持就无法实现唯一约束。 和属性是架构生成工具生成相应约束的指令,它们本身并没有实现约束。 您可以在插入新实体之前进行某种手动检查,但是在这种情况下,您应该意识到并发事务可能存在的问题。 因此,

  • 问题内容: 我有一个具有这种布局的表: 我想创建一个类似于以下的唯一约束: 但是,这将允许多行具有相同的if 。我想允许在存储不具有关联菜单中的最爱,但我只希望每个用户/食谱对这些行中最多只有一个。 到目前为止,我的想法是: 使用一些硬编码的UUID(例如全零)而不是null。 但是,每个用户的菜单都有FK约束,因此我不得不为每个用户创建一个特殊的“空”菜单,这很麻烦。 而是使用触发器检查是否存在

  • 以下两者之间有区别吗: 以及: 在这两种情况下,名称是否唯一?索引唯一时意味着什么? 编辑:Postgres是唯一的约束,而索引没有回答我的问题。它考虑了FK的情况。我的问题与FK无关。我只想知道在这个例子中,这两个操作是否等价,其中不涉及FK。

  • 主要内容:在创建表时设置唯一约束,在修改表时添加唯一约束,删除唯一约束MySQL 唯一约束(Unique Key)是指所有记录中字段的值不能重复出现。例如,为 id 字段加上唯一性约束后,每条记录的 id 值都是唯一的,不能出现重复的情况。如果其中一条记录的 id 值为‘0001’,那么该表中就不能出现另一条记录的 id 值也为‘0001’。 唯一约束与主键约束相似的是它们都可以确保列的唯一性。不同的是,唯一约束在一个表中可有多个,并且设置唯一约束的列允许有空值,但

  • 主要内容:Oracle唯一约束语法,Oracle唯一约束例子在本教程中,您将学习如何使用Oracle唯一约束来确保包含在一列或几列中的数据在表中的行之间是唯一的。 Oracle唯一约束语法 一个唯一的约束是一个完整性约束,它确保存储在一列或一组列中的数据在表中的行之间是唯一的。 通常,在使用内联约束语法创建表时,将唯一约束应用于列,如下所示: 此唯一约束指定中的值在整个表中是唯一的。也可以使用外线()约束语法来定义一个唯一的约束: 可以通过使用子句和约束名

  • 当我试图创建第二个表时,我遇到了以下错误,但我不知道为什么。对于表patente,我希望能够将(idfunconario,titulo)作为主键。正如其他主题中所建议的,我已经尝试将唯一约束设置为“唯一(IDFunconario,titulo)”。 消息错误: 错误:没有唯一的约束匹配引用表"public acao"的给定键SQL状态:42830 我在64位的Windows 8.1上使用Postg