peewee — peewee 3.16.2 documentationhttp://docs.peewee-orm.com/en/latest/#
from peewee import *
db = SqliteDatabase('school.db')
Peewee支持多种数据库:
PostgresqlDatabase
MySQLDatabase
SqliteDatabase
这里使用Sqlite做为范例.
class Student(Model): # 学生类
name = CharField()#姓名字段,文本
age = IntegerField()#年龄字段,整数
student_number = CharField(unique=True)#学生编号,文本,唯一
class Meta:
database = db # 这个模型使用或建立在数据库'school.db'
legacy_table_names = False # 自动表名是否使用下划线分割命名,False为使用
table_name = '学生表' # 自定义表名,与legacy_table_names互斥
class Grades(Model): # 成绩类
# 外键,与Student模型成立关系
student_number = ForeignKeyField(
model=Student, # 与Student模型关联
field='student_number', # 与student_number字段关联,各项属性一致
backref='grades')
project = CharField()
c_score = FloatField()
m_score = FloatField()
e_score = FloatField()
class Meta:
database = db # 这个模型使用或建立在数据库'school.db'
legacy_table_names = False # 自动表名是否使用下划线分割命名,False为使用
table_name = '成绩表' # 自定义表名,与legacy_table_names互斥
模型的理解:
可以使用数据库创建:
db.create_tables([Student, Grades]) # 可以批量创建.如表已存在,则不作操作.
也可以用模型来创建:
Student.create_table() # 只能创建模型对应的表
s1 = Student(name='张左', age=21, student_number='1111')
s1.save() # 不执行不保存
# 或
s1 = Student()
s1.name = '张右'
s1.age = 21
s1.student_number = '1111'
s1.save() # 不执行不保存
# 或
s1 = Student.create(name='张左', age=21, student_number='1111') # 不需要save
data = [
['charlie', 25, '2222'],
['huey', 28, '3333'],
['zaizee', 31, '4444']]
query = Student.insert_many(data, fields=list(Student._meta.fields.values())[1:])
query.execute()
# 或
with db.atomic():
slist = [Student(name='黄%s' % i, age=20, student_number='K%s' % (i + 10)) for i in range(3)]
Student.bulk_create(slist)
# 在关系表中新增一条数据
s9 = Student(name='张九', age=23, student_number='9999')
s9.save() # 不执行不保存
g1 = Grades(student_number=s9, project='段考', c_score=100, m_score=99, e_score=88)
g1.save()
s2 = Student(name='张右', age=21, student_number='2222')
s3 = Student(name='李左', age=21, student_number='3333')
s4 = Student(name='李右', age=21, student_number='4444')
l2 = [s2]+['一模', 100, 99, 98]
l3 = [s3]+['一模', 60, 70, 80]
l4 = [s4]+['一模', 80, 55, 100]
data = [l2,l3,l4]
query = Grades.insert_many(data, fields=list(Grades._meta.fields.values())[1:])
query.execute()
with db.atomic():
Student.bulk_create([s2,s3,s4])
注意:因为student_number设置了unique,如果新增数据时,数据可能重复,应该注意处理IntegrityError错误
Student.delete_by_id(6) # 建模型时,会自动设置一个自增字段id,并设为主键.
query = Student.delete().where(Student.name == "黄0")
query.execute() # 不执行不保存
query = Student.delete()
query.execute()
注意:删除操作其实是生成一个删除查询,查不到也就不会删除,不会产生错误.
Student.update({'name': '钱一'}).where(Student.name == '黄2').execute()