怎么在Python中实现ORM编程

  

怎么在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自动实现以下操作:

  1. 将这些调用转换为SQL语句;

  2. 通过数据库引擎发送个给数据库执行;

  3. 将数据库返回的结果记录用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 (& # 39; sampleDB.db& # 39;):
  os.remove才能(& # 39;sampleDB.db& # 39;)
  #,引入矮小的包的所有内容
  得到peewee  import  *
  #,建立一个Sqlite数据库引擎对象,该引擎打开数据库文件sampleDB.db
  时间=db  SqliteDatabase (“sampleDB.db")
  #,定义一个ORM的基类,在基类中指定本ORM所使用的数据库,
  #,这样在之后所有的子类中就不用重复声明数据库
  class  BaseModel(模型):
  class 才能;元:
  ,,,database =db
  #,定义表,继承自BaseModel
  class 课程(BaseModel):
  时间=id 才能;PrimaryKeyField(), #,定义主键
  时间=title 才能;CharField (null=False), #,定义字符串
  时间=period 才能;IntegerField(), #,整型
  时间=description 才能;CharField ()
  class 才能;元:
  ,,,order_by =,(& # 39;标题# 39;,)
  ,,,db_table =, & # 39;课程# 39;,,#,定义数据库中的表名
  #,定义,teacher 表,继承自BaseModel
  class 老师(BaseModel):
  时间=id 才能;PrimaryKeyField ()
  时间=name 才能;CharField (null=False)
  时间=gender 才能;BooleanField(), #,布尔型
  时间=address 才能;CharField ()
  #,才能ForeignKeyField 设置与课程的连接关系,其中的参数:to_field用于指定被连接的字段名,related_name参数对该关系赋予了一个名字
  时间=course_id 才能;ForeignKeyField(当然,to_field=癷d",, related_name=癱ourse")
  class 才能;元:
  ,,,order_by =,(& # 39;名字# 39;,)
  ,,,db_table =,“teacher"
  #,建表,仅需创建一次
  Course.create_table ()
  Teacher.create_table ()
  #,新增行
  Course.create (id=1,标题=& # 39;经济学& # 39;,,=320,,描述=& # 39;文理科学生均可选修& # 39;)
  Course.create (id=2,标题=& # 39;大学英语& # 39;,,=300,,描述=& # 39;大一学生必修课& # 39;)
  Course.create (id=3,, title=& # 39;哲学& # 39;,,=100,,描述=& # 39;必修课& # 39;)
  Course.create (id=134,标题=& # 39;编译原理& # 39;,,=100,,描述=& # 39;计算机系选修& # 39;)
  Teacher.create (name=& # 39;白阵君& # 39;,,性别=True,地址=& # 39;. . & # 39;,,course_id=1)
  Teacher.create (name=& # 39;李森& # 39;,,性别=True,地址=& # 39;. . & # 39;,,course_id=3)
  Teacher.create (name=& # 39;张雯雯& # 39;,,性别=False,地址=& # 39;. . & # 39;,,course_id=2)
  #,查询一行
  时间=record  Course.get (Course.title ==, & # 39;大学英语& # 39;)
  print(“课程:% s,学时:% d,课程类型:,% s", %, (record.title, record.period,, record.description))
  #,更新
  record.period =200
  record.save ()
  #,删除
  record.delete_instance ()
  #,查询所有记录
  时间=courses  Course.select ()
  for 小姐:拷贝;课程:
  打印才能(i.id, i.title,, i.period,, i.description)
  #,带条件查询,并将结果按段字段倒序排序
  时间=courses  Course.select()其中(Course.id

怎么在Python中实现ORM编程