python web框架如何处理与数据库的交互
1.ORM
在python中通过关系映射(orm),调用底层dbapi来实现数据库的操作。通过定义类和对象,(类是表,类的对象是数据库的一行数据。)来操作数据库,通过底层的转换,最终形成sql,在相应的数据库中执行。
对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。
一般的ORM包括以下四部分:
一个对持久类对象进行CRUD操作的API;
一个语言或API用来规定与类和类属性相关的查询;
一个规定MAPPING METADATA的工具;
一种技术可以让ORM的实现同事务对象一起进行DIRTYCHECKING, LAZY ASSOCIATION FETCHING以及其他的优化操作。
2不同web框架的选择
Django
Django使用了自带的ORM来处理数据库操作,你只需定义模型类,之后可以使用模型的方法来进行数据库操作。
# models.py
from django.db import models
class Blog(models.Model):
title = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
# views.py
from django.shortcuts import render
from .models import Blog
def index(request):
latest_blogs = Blog.objects.order_by('-pub_date')[:5]
context = {'latest_blogs': latest_blogs}
return render(request, 'blogs/index.html', context)
Django 里更关注的是模型(Model)、模板(Template)和视图(Views),Django 也被称为 MTV 框架 。在 MTV 开发模式中:
M 代表模型(Model),即数据存取层。 该层处理与数据相关的所有事务: 如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。
T 代表模板(Template),即表现层。 该层处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。
V 代表视图(View),即业务逻辑层。 该层包含存取模型及调取恰当模板的相关逻辑。 你可以把它看作模型与模板之间的桥梁。
Flask
Flask本身不包含ORM,但可以配合SQLAlchemy使用。
# app.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
db = SQLAlchemy(app)
class Blog(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(200), nullable=False)
pub_date = db.Column(db.DateTime, nullable=False)
@app.route("/")
def home():
blogs = Blog.query.order_by(Blog.pub_date.desc()).limit(5).all()
return str(blogs)
if __name__ == '__main__':
app.run(debug=True)
FastApi
使用 SQLAlchemy 的 ORM 定义数据模型。
#定义模型
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Item(Base):
__tablename__ = 'items'
id = Column(Integer, primary_key=True, index=True)
name = Column(String, index=True)
#配置数据库
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
SQLALCHEMY_DATABASE_URL = "postgresql://user:password@localhost/dbname"
engine = create_engine(SQLALCHEMY_DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
#定义 API 路由:
#在 FastAPI 中定义路由并注入 session
from fastapi import FastAPI, Depends
from sqlalchemy.orm import Session
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
app = FastAPI()
@app.post("/items/", response_model=Item)
def create_item(item: Item, db: Session = Depends(get_db)):
db.add(item)
db.commit()
db.refresh(item)
return item
@app.get("/items/{item_id}", response_model=Item)
def read_item(item_id: int, db: Session = Depends(get_db)):
return db.query(Item).filter(Item.id == item_id).first()
2.sqlalchemy与tortoise
2.1 相似
FastAPI web框架与异步框架tortoise,这个框架使用起来能够更好地与FastAPI异步框架继承,但是FastAPI框架官方介绍的是sqlalchemy框架,它是同步的,是不支持await的。所以跟数据库进行交互时候,使用异步的ORM框架是非常合适的,FastAPI框架受到Django框架的ORM启发,异步ORM框架tortoise应运而生。
2.2区别
(1)SQLAlchemy是一个成熟的ORM(对象关系映射)库,而Tortoise则是一个异步ORM库。SQLAlchemy可以与各种关系型数据库配合使用,而Tortoise则主要与异步数据库(如PostgreSQL、MySQL和SQLite)配合使用。
(2)SQLAlchemy提供了完整的ORM功能,可以将数据库表映射到Python类,同时提供高级查询、事务和连接池等功能。Tortoise也提供了类似的ORM功能,但是专注于异步操作,可以与异步框架(如FastAPI)更好地集成。
(3)SQLAlchemy支持多种查询语言(如SQL、ORM查询等),可根据特定需求进行自由切换。Tortoise则采用异步查询语法,例如使用Tortoise提供的查询构建器进行操作。
(4)对于数据库迁移和模式管理,SQLAlchemy提供了Alembic工具,可以轻松地执行数据库迁移和管理模式变更。而Tortoise则有自己的数据库迁移工具Aerich,可以方便地进行模式管理和迁移,迁移的方法类似于Flask框架的flask-sqlalchemy框架,但是Aerich不支持跨数据库迁移,因此需要在本地环境和生产环境都使用相同的数据库引擎。
综上所述,SQLAlchemy和Tortoise是两种不同的ORM库,适用于不同的场景和需求。SQLAlchemy更适合传统的同步应用程序,而Tortoise则更适合异步应用程序,并且能够更好地与FastAPI等异步框架集成。选择哪个库取决于你的具体需求和技术栈
标签:web,SQLAlchemy,框架,python,数据库,db,ORM,import,交互 From: https://www.cnblogs.com/SuIyubOx/p/18292970