- Peewee教程
- Peewee - 主页
- Peewee - 概述
- Peewee - 数据库类
- Peewee - 模型
- Peewee - 野外课程
- Peewee - 插入新记录
- Peewee - 选择记录
- Peewee - 过滤器
- Peewee - 主键和复合键
- Peewee - 更新现有记录
- Peewee - 删除记录
- Peewee - 创建索引
- Peewee - 约束
- Peewee - 使用 MySQL
- Peewee - 使用 PostgreSQL
- Peewee - 动态定义数据库
- Peewee - 连接管理
- Peewee - 关系与加入
- Peewee - 子查询
- Peewee - 排序
- Peewee - 计数和聚合
- Peewee - SQL 函数
- Peewee - 检索行元组/字典
- Peewee - 用户定义的运算符
- Peewee - 原子事务
- Peewee - 数据库错误
- Peewee - 查询生成器
- Peewee - 与 Web 框架集成
- Peewee - SQLite 扩展
- Peewee - PostgreSQL 和 MySQL 扩展
- Peewee - 使用 CockroachDB
- Peewee有用资源
- Peewee - 快速指南
- Peewee - 有用的资源
- Peewee - 讨论
Peewee - 主键和复合键
建议关系数据库中的表应具有应用主键约束的列之一。因此,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 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。