ORM
先来了解什么是ORM,以及ORM用来解决什么问题?
我们在开发web应用的过程中,不可避免地会涉及到CRUD操作,就需要用到数据库管理软件,例如mysql、oracle、Microsoft SQL Server等。
如果应用程序需要操作数据(比如将用户注册信息永久存放起来),那么我们需要在应用程序中编写原生sql语句,然后使用pymysql模块远程操作mysql数据库
但直接编写原生sql语句会存在两方面的问题,严重影响开发效率,如下
- sql语句的执行效率问题:应用开发程序员需要耗费一大部分精力去优化sql语句
- 数据库迁移问题:针对mysql开发的sql语句无法直接应用到oracle数据库上,一旦需要迁移数据库,便需要考虑跨平台问题
- 在写业务逻辑代码的时候,需要花费大量的精力去写繁杂的实现数据库的增删改查的代码,从而使数据访问层过于庞大
为了解决上述问题,引入了ORM的概念,ORM全称Object Relational Mapping,即对象关系映射,,主要描述的是程序中的Object对象和关系型数据库中Rlation关系(表)之间的映射关系,是一种进行程序和数据库之间数据持久化的一种编程思想。是在pymysq之上又进行了一层封装,对于数据的操作,我们无需再去编写原生sql,取代代之的是基于面向对象的思想去编写类、对象、调用相应的方法等,ORM会将其转换/映射成原生SQL然后交给pymysql执行。
ORM技术的出现也使得我们在书写业务逻辑代码的时候,不需要花费大量的精力去书写繁杂的数据访问层,相应的CRUD操作都可以交给相应的ORM插件自动生成代码去完成。
SQLAlchemy使用
SQLAlchemy是Python中最有名的ORM架构
下面我们把SQLAlchemy与Flask简单集成的例子来看看SQLAlchemy的基本使用
安装SQLAlchemy
pip install SQLAlchemy
新建Flask项目,项目结构如下
其中models文件夹下的students.py存放数据表模型,定义了相应数据表的对象模型映射,每个类代表一张表,每个类的对象代表该数据表的一行元组
from sqlalchemy import Column, String
from sqlalchemy.ext.declarative import declarative_base
# 创建对象的基类:
Base = declarative_base()
# 定义User对象:
class Student(Base):
# 表的名字:
__tablename__ = 'user'
# 表的结构:
id = Column(String(20), primary_key=True)
name = Column(String(20))
config.py存放了该Flask项目的相应config配置,在配置项繁多的时候需要把配置项单独写在一个文件中,有利于项目管理,并且可以进一步把开发环境、测试环境、生产环境所需的配置区分开来
class Config:
SECRET_KEY = "atuo_200"
SQLALCHEMY_COMMIT_ON_TEARDOWN = True
SQLALCHEMY_TRACK_MODIFICATIONS = False
# 开发环境
class DevelopmentConfig(Config):
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:[email protected]:3306/martdata'
# 测试环境
class TestingConfig(Config):
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:[email protected]:3306/martdata'
# 生产环境
class ProductionConfig(Config):
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:[email protected]:3306/martdata'
# 配置字典
config = {
'development': DevelopmentConfig,
'testing': TestingConfig,
'production': ProductionConfig,
'default': DevelopmentConfig
}
app.py操作相应的数据表模型,并获取表中的数据,传送到模板进行渲染展示
from flask import Flask,render_template
from sqlalchemy import *
from sqlalchemy.orm import sessionmaker
#导入存储配置的字典
from config import config
#导入数据表模型
from models.students import *
app = Flask(__name__)
app.config.from_object(config["development"])
#获取表中的数据,传送到模板利用jiaja进行渲染展示
@app.route("/")
def test():
res = session1.query(Student).all()
return render_template("index.html",res = res)
if __name__ == "__main__":
engine = create_engine(app.config.get("SQLALCHEMY_DATABASE_URI"))
# 创建DBSession类型:
DBSession = sessionmaker(bind=engine)
session1 = DBSession()
#先把原来的数据表映射删除再创建
Base.metadata.drop_all(engine)
Base.metadata.create_all(engine)
session1.add_all([
Student(id = "1",name = "atuo"),Student(id = "2",name="帅坨"),Student(id = "3",name="小坨"),Student(id = "4",name="程洁"),Student(id = "5",name="阿坨")
])
#过滤查询
res_list = session1.query(Student).filter(Student.id < 2).all()
#更新特定数据
session1.query(Student).filter_by(name = "阿坨").update({
"name":"阿坨坨"})
#删除特定数据
session1.query(Student).filter_by(name = "小坨").delete()
#提交即保存至数据库
session1.commit()
app.run()
此时到mysql查看相应的数据表,都已自动完成相应的数据插入、更新、删除操作,而我们并没有书写任何一句SQL语句(只需要把MySQL打开)
index.html代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>python之ORM</title>
</head>
<body>
{% for i in res %}
<h3>{
{ i.name }}</h3>
{% endfor %}
</body>
</html>