怎么在Python中实现ORM编程?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:主机域名、虚拟空间、营销软件、网站建设、文昌网站维护、网站推广。ORM编程
ORM(object-relational mapping)对象关系映射 作用:在关系型数据库和业务实体对象之间做一个映射,方便在开发中,不需要再使用复杂的sql语句,只需要简单操作对象的属性与方法。 所有ORM具备3方面基本能力:映射技术、CRUD操作、缓存优化。每种编程语言都具有自己的ORM库,java 的Hibernate、IBATIS;C#的Grove LINQ; Python 的 SQLAlchemy
1、映射技术
面向对象是从软件工程的基本原则(如耦合、聚合、封装)的基础由来 关系型数据库是从数学理论上的基础发展而来。
ORM库需解决三个问题:
数据类型映射:将数据库的类型映射为编程语言自身的类型;
类映射:将数据表定义映射为编程语言自身的类;
关系映射:将数据库中基于外键的关系连接转换为编程语言中基于对象引用的关系连接。
2、CRUD操作
C–Create(增加)
R–Retrieve(读取,重新得到数据)
U–Update(更新)
D–Delete(删除)
在SQL中:insert,select, update,delete四种语句实现CRUD
ORM自动实现以下操作:
将这些调用转换为SQL语句;
通过数据库引擎发送个给数据库执行;
将数据库返回的结果记录用ORM映射技术转换为类对象。
3、缓存优化
将从数据库中查询到的数据以类对象形式保存在本地内存中,以便之后再用时随时抽取。
在真正需要读取查询结果时才执行数据库的select操作,而不是在ORM查询命令执行时查询数据库。
4、用peewee进行ORM数据库编程
思路:
导入需要的包:peewee,建立一个数据库引擎对象db
定义一个ORM基类:BaseModel(),建立SQLite连接
类型映射:定义一些数据类型
表映射:定义两个对象类:course, teacher
关系映射:使用ForeignKeyField 设置与course的连接关系,其中的参数:to_field用于指定被连接的字段名,related_name参数对该关系赋予了一个名字
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)
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注创新互联成都网站设计公司行业资讯频道,感谢您对创新互联成都网站设计公司的支持。
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、网站设计器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。