本文实例讲述了Python ORM编程。分享给大家供大家参考,具体如下:
ORM编程
ORM(object-relational mapping)对象关系映射 作用:在关系型数据库和业务实体对象之间做一个映射,方便在开发中,不需要再使用复杂的sql语句,只需要简单操作对象的属性与方法。 所有ORM具备3方面基本能力:映射技术、CRUD操作、缓存优化。每种编程语言都具有自己的ORM库,java 的Hibernate、IBATIS;C#的Grove LINQ; Python 的 SQLAlchemy
1、映射技术
面向对象是从软件工程的基本原则(如耦合、聚合、封装)的基础由来 关系型数据库是从数学理论上的基础发展而来。
ORM库需解决三个问题:
2、CRUD操作
在SQL中:insert,select, update,delete四种语句实现CRUD
ORM自动实现以下操作:
3、缓存优化
4、用peewee进行ORM数据库编程
思路:
import os if os.path.exists('sampleDB.db'): os.remove('sampleDB.db') # 引入peewee包的所有内容 from peewee import * # 建立一个Sqlite数据库引擎对象,该引擎打开数据库文件sampleDB.db db = SqliteDatabase("sampleDB.db") # 定义一个ORM的基类,在基类中指定本ORM所使用的数据库, # 这样在之后所有的子类中就不用重复声明数据库 class BaseModel(Model): class Meta: database = db # 定义course表,继承自BaseModel class Course(BaseModel): id = PrimaryKeyField() # 定义主键 title = CharField(null=False) # 定义字符串 period = IntegerField() # 整型 description = CharField() class Meta: order_by = ('title',) db_table = 'course' # 定义数据库中的表名 # 定义 teacher 表,继承自BaseModel class Teacher(BaseModel): id = PrimaryKeyField() name = CharField(null=False) gender = BooleanField() # 布尔型 address = CharField() # ForeignKeyField 设置与course的连接关系,其中的参数:to_field用于指定被连接的字段名,related_name参数对该关系赋予了一个名字 course_id = ForeignKeyField(Course, to_field="id", related_name="course") class Meta: order_by = ('name',) db_table = "teacher" # 建表,仅需创建一次 Course.create_table() Teacher.create_table() # 新增行 Course.create(id=1, title='经济学', period=320, description='文理科学生均可选修') Course.create(id=2, title='大学英语', period=300, description='大一学生必修课') Course.create(id=3, title='哲学', period=100, description='必修课') Course.create(id=134, title='编译原理', period=100, description='计算机系选修') Teacher.create(name='白阵君', gender=True, address='..', course_id=1) Teacher.create(name='李森', gender=True, address='..', course_id=3) Teacher.create(name='张雯雯', gender=False, address='..', course_id=2) # 查询一行 record = Course.get(Course.title == '大学英语') print("课程:%s, 学时:%d, 课程类型: %s" % (record.title, record.period, record.description)) # 更新 record.period = 200 record.save() # 删除 record.delete_instance() # 查询所有记录 courses = Course.select() for i in courses: print(i.id, i.title, i.period, i.description) # 带条件查询,并将结果按period字段倒序排序 courses = Course.select().where(Course.id< 10).order_by(Course.period.desc()) for i in courses: print(i.id, i.title, i.period, i.description) # 统计所有课程的平均学时 total = Course.select(fn.Avg (Course.period).alias('avg_period')) for i in total: print(u"平均学时:", i.avg_period) # 更新多个记录 Course.update(period=300).where(Course.id > 100).execute() # 多表连接操作,Peewee会自动根据ForeignKeyField的外键定义进行连接: Record = Course.select().join(Teacher).where(Teacher.gender == True) for i in Record: print(i.id, i.title, i.period, i.description)
参考来源:书籍《python 高效开发实战》
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python常见数据库操作技巧汇总》、《Python数学运算技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:notice#nhooo.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。