Peewee – 主键和复合键
建议关系型数据库中的表应该有一列应用主键约束。因此,Peewee模型类也可以指定字段属性,并将主键参数设置为真。然而,如果模型类没有任何主键,Peewee会自动创建一个名为 “id “的主键。请注意,上面定义的用户模型没有任何字段被明确定义为主键。因此,我们数据库中映射的用户表有一个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类中的主键。在下面的例子中,一个由用户模型的姓名和城市字段组成的复合键被指定为复合键。
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。