python之ORM——SQLAlchemy使用

ORM

先来了解什么是ORM,以及ORM用来解决什么问题?

我们在开发web应用的过程中,不可避免地会涉及到CRUD操作,就需要用到数据库管理软件,例如mysql、oracle、Microsoft SQL Server等。

如果应用程序需要操作数据(比如将用户注册信息永久存放起来),那么我们需要在应用程序中编写原生sql语句,然后使用pymysql模块远程操作mysql数据库

但直接编写原生sql语句会存在两方面的问题,严重影响开发效率,如下

  1. sql语句的执行效率问题:应用开发程序员需要耗费一大部分精力去优化sql语句
  2. 数据库迁移问题:针对mysql开发的sql语句无法直接应用到oracle数据库上,一旦需要迁移数据库,便需要考虑跨平台问题
  3. 在写业务逻辑代码的时候,需要花费大量的精力去写繁杂的实现数据库的增删改查的代码,从而使数据访问层过于庞大

为了解决上述问题,引入了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>

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/atuo200/article/details/109761592