首先,需要理清一下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'})