首先,需要理清一下python数据与数据库数据是怎么对应的:
- Model类:表
- Field类:表上的列的类型
- Model实例:表上的一行数据
1. Model Class
主要描述的是数据表以及其继承的顺序
这里主要是需要对Model类中的Meta类的定义规范进行小结:
- 当Meta类建立后,不应该通过
mymodel.Meta
来进行访问,而应该使用mymodel._meta
, 这是一个ModelOption
类的实例, 可以通过它获取model和Meta的一些属性 - Meta的可用属性有:
除了db_table
和table_alias
之外,其他的字段均可以被继承
可以看到,peewee的主键,索引和其他约束均可以在meta中定义。 - 主键的定义
class mymodel1(Model):
name = CharField(max_length=200, primary_key=True) #将该字段设为主键
class mymodel2(Model):
name = CharField(max_length=200)
Meta:
# 如果要不使用主键
primary_key = False
class mymodel3(Model):
blog = ForeignKeyField(Blog)
tag = ForeignKeyField(Tag)
class Meta:
primary_key = CompositeKey('blog', 'tag') # primary_key实际上是CompositeKey的一个实例
非整型的主键
当主键为非auto_increment
时,插入数据调用save()会出错,应该调用save(force_insert=True)
- 添加索引
单列索引
多列索引
2. Field Class
主要描述python数据类型与数据库数据类型的对应关系和数据表之间的关系(外键,多对多)
Filed在peewee.py中有基本数据类型的定义
# 初始化函数,各个字段的默认值
def __init__(self, null=False, index=False, unique=False,
verbose_name=None, help_text=None, db_column=None,
default=None, choices=None, primary_key=False, sequence=None,
constraints=None, schema=None)
在playhouse.fields中定义的额外字段
包括
PasswordField
ManyToManyField
CompressedField
PickledField
AESEncryptedField
然而peewee中并不推荐使用这些Field, 例如ManyToManyField,完全可以用一个含两个外键的关系表来维护,ManyToMany关系在ORM中实际上也正是这样来实现的,并且使用这种方式可以描述更加复杂的关系。
自定义field字段
# 1. 定义MyField类
class MyField(Field):
# Field的标签
db_field = 'my'
# 返回数据库类型的值
def db_value(value):
pass
# 返回python类型的值
def python_value(value):
pass
# 2. 将自定义Field子类与数据表中的列关联,有两种方法:
# 1. 创建数据库时,给fields字段赋值
db = MySQLDatabase('my_db', fields={'my': 'my'})
# 2. 调用register_fields函数
db.register_fields({'my':'my'})
人的一生只有两万来天,效率至上