一 ORM是什么?为何要有ORM?
我们在使用Django框架开发web应用的过程中,不可避免地会涉及到数据的管理操作(增、删、改、查),而一旦谈到数据的管理操作,就需要用到数据库管理软件,例如mysql、oracle、Microsoft SQL Server等。
如果应用程序需要操作数据(比如将用户注册信息永久存放起来),那么我们需要在应用程序中编写原生sql语句,然后使用pymysql模块远程操作mysql数据库
针对应用程序的数据操作,直接编写原生sql语句会存在两方面的问题,严重影响开发效率,如下
#1. sql语句的执行效率问题:应用开发程序员需要耗费一大部分精力去优化sql语句
#2. 数据库迁移问题:针对mysql开发的sql语句无法直接应用到oracle数据库上,一旦需要迁移数据库,便需要考虑跨平台问题
为了解决上述问题,django引入了ORM的概念,ORM全称Object Relational Mapping,即对象关系映射,是在pymysq之上又进行了一层封装,对于数据的操作,我们无需再去编写原生sql,取代代之的是基于面向对象的思想去编写类、对象、调用相应的方法等,ORM会将其转换/映射成原生SQL然后交给pymysql执行
有了ORM框架,开发人员既不用再去考虑原生SQL的优化问题,也不用考虑数据库迁移的问题,ORM都帮我们做了优化且支持多种数据库,这极大地提升了我们的开发效率
如何使用:
1、数据来源于数据库的表,而ORM的模型类对应数据库表,所以若我们想操作数据,必须先创建模型。
2、再注册到应用
3、再配置数据库连接
以下是一个 mysql的数据库连接配置,包含用的pymysql库,用户名zwq,密码5dc580,服务器zxz.xtaa.cn,数据库名douy
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://zwq:5dc580@zxz.xtaa.cn/douyin?charset=utf8"
Flask是一个轻量级的Web框架,其中集成的ORM工具SQLAlchemy,使得在Python中进行数据库操作变得更加简单。在Flask中,使用ORM可以通过使用db.session对象访问数据库,将操作转换为Python对象的方法。 在ORM中的一个核心概念是关系,即对象之间的关系。在Flask中,使用db.relationship来创建关系。本文将通过几个方面详细介绍db.relationship的使用。
一、创建一对多关系
在ORM中,一对多关系是指一个对象(如一个用户)可以有多个子对象(如多个订单)。在Flask中,可以通过db.relationship和backref参数来定义一对多关系。在这种关系中,一个对象(如User)可以有多个子对象(如Order),而一个子对象(如Order)只能归属于一个对象(如User)。
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
orders = db.relationship("Order", backref="user")
class Order(db.Model):
id = db.Column(db.Integer, primary_key=True)
total_price = db.Column(db.Float)
user_id = db.Column(db.Integer, db.ForeignKey("user.id"))
user = User.query.first()
orders = user.orders
for order in orders:
print(order.total_price)
在这个示例中,User和Order模型之间建立了一对多关系。User模型中通过db.relationship定义了一个名为orders的属性。在Order模型中通过user_id列的外键来关联User模型。同时,backref参数定义了子对象如何访问父对象。在这个示例中,我们可以通过user.orders访问该用户的所有订单,并通过for循环遍历订单对象,打印其总价。
二、创建多对多关系
多对多关系是指两个对象之间相互关联,一个对象可以有多个子对象,同时一个子对象也可以归属于多个对象。在Flask中,可以通过db.relationship和secondary参数来定义多对多关系。在这种关系中需要创建一个关联表,用来保存多对多的关系。
association_table = db.Table(
'association', db.Model.metadata,
db.Column('user_id', db.Integer, db.ForeignKey('user.id')),
db.Column('project_id', db.Integer, db.ForeignKey('project.id')))
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
projects = db.relationship("Project", secondary=association_table, backref="users")
class Project(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
user = User.query.first()
projects = user.projects
for project in projects:
print(project.name)
在这个示例中,User和Project模型之间建立了多对多关系。User模型中定义了名为projects的属性。在Project模型中同样定义了名为users的属性来反向访问父对象。关联表association_table通过db.Table来创建。在User模型中通过secondary参数来指定关联表。在示例中,我们可以通过user.projects访问该用户所参与的所有项目,并通过for循环遍历打印每个项目的名字。
三、定义关系属性的限制
在ORM中,还可以为关系属性定义一些限制,如elenment_order、primaryjoin、secondaryjoin等等。这些限制可以帮助我们更好地控制我们的关系。例如,为了控制查询结果,我们可以添加primaryjoin参数
四、使用back_populates来反向引用一对多关系
在Flask中,我们可以使用back_populates来反向引用一对多关系。这种方式可以帮助我们更好地控制关系,并避免循环引用