Peewee - 主鍵和複合主鍵



建議關係資料庫中的表應該有一列應用主鍵約束。相應地,Peewee 模型類也可以指定欄位屬性,並將 primary-key 引數設定為 True。但是,如果模型類沒有任何主鍵,Peewee 會自動建立一個名為“id”的主鍵。請注意,上面定義的 User 模型沒有任何欄位明確定義為主鍵。因此,我們資料庫中對映的 User 表有一個 id 欄位。

要定義一個自動遞增的整數主鍵,請在模型中使用 **AutoField** 物件作為屬性。

class User (Model):
   user_id=AutoField()
   name=TextField()
   age=IntegerField()
   class Meta:
      database=db
      db_table='User'

這將轉換為以下 CREATE TABLE 查詢:

CREATE TABLE User (
   user_id INTEGER NOT NULL
   PRIMARY KEY,
   name TEXT NOT NULL,
   age INTEGER NOT NULL
);

您也可以將任何非整數字段指定為主鍵,方法是將 primary_key 引數設定為 True。假設我們想儲存某個字母數字值作為 user_id。

class User (Model):
   user_id=TextField(primary_key=True)
   name=TextField()
   age=IntegerField()
   class Meta:
      database=db
      db_table='User'

但是,當模型包含非整數字段作為主鍵時,模型例項的 **save()** 方法不會導致資料庫驅動程式自動生成新 ID,因此我們需要傳遞 **force_insert=True** 引數。但是,請注意,**create()** 方法隱式指定了 force_insert 引數。

User.create(user_id='A001',name="Rajesh", age=21)
b=User(user_id='A002',name="Amar", age=20)
b.save(force_insert=True)

save() 方法還會更新表中的現有行,此時不需要 force_insert 主鍵,因為具有唯一主鍵的 ID 已經存在。

Peewee 允許定義複合主鍵的功能。**CompositeKey** 類的物件在 Meta 類中定義為主鍵。在下面的示例中,由 User 模型的 name 和 city 欄位組成的複合鍵已被指定為複合主鍵。

class User (Model):
   name=TextField()
   city=TextField()
   age=IntegerField()
   class Meta:
      database=db
      db_table='User'
      primary_key=CompositeKey('name', 'city')

此模型轉換為以下 CREATE TABLE 查詢。

CREATE TABLE User (
   name TEXT NOT NULL,
   city TEXT NOT NULL,
   age INTEGER NOT NULL,
   PRIMARY KEY (
      name,
      city
   )
);

如果您希望表沒有主鍵,則在模型的 Meta 類中指定 primary_key=False。

廣告
© . All rights reserved.