Peewee - 主键和复合键
建议关系型数据库中的表,其中一列应用主键约束。 因此,Peewee 模型类还可以指定字段属性,并将主键参数设置为 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 primary,因为具有唯一主键的 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。

