建议关系数据库中的表应该有一列用于主键约束,相应地,Peewee Model类也可以指定主键参数设为True的字段属性。但是,如果模型类没有任何主键,Peewee会自动创建一个名为“id”的主键。注意,上面定义的用户模型没有任何字段显式定义为主键。因此,数据库中映射的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
即可 。
酷客网相关文章:
评论前必须登录!
注册