首页 > 数据库 >python web框架如何处理与数据库的交互

python web框架如何处理与数据库的交互

时间:2024-07-09 23:52:11浏览次数:13  
标签:web SQLAlchemy 框架 python 数据库 db ORM import 交互

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

相关文章

  • 初学python
    一python的历史python的起源Python的创始人是GuidovanRossum(吉多·范罗苏姆),他于1989年圣诞节期间开始编写Python,最初的目标是创建一门易读、简洁且可扩展的编程语言。GuidovanRossum受到ABC语言的启发,ABC是一门教育用语言,他希望创建一门对新手友好但也能满足专业开发者......
  • 第五篇、Python列表:多功能的数据结构
    在Python编程中,列表是一种极其重要且灵活的数据结构。本文将深入探讨Python中的列表,包括列表的定义、遍历方法和常见操作。一、列表的定义列表是Python中最常用的数据类型之一,它是一个可变的、有序的元素集合。列表的特点包括:可以存储不同类型的数据元素之间用逗号分隔使用......
  • 要想熟练就每天看一遍python列表
    一.列表的定义        列表是Python中的一种数据结构,用于存储多个数据项。它是有序的,可以包含不同类型的数据,包括整数、浮点数、字符串、布尔值、None等。列表用方括号[]括起来,数据项之间用逗号分隔。例如,[1,2,3,"hello",4.5]就是一个列表。列表可以包含任意数量......
  • 如何用Java python php 实现身份实名人证?
    身份证实名认证,也被称为身份证识别或核验身份信息,是指基于直连公安大数据,在用户授权后,通过姓名、身份证号实时快速核验用户身份信息真伪的过程。这种认证方式可以与身份证OCR(光学字符识别)和活体检测技术灵活融合,广泛应用于需要用户实名认证的行业场景,如电商、游戏、直播等。......
  • [CSAWQual 2019]Web_Unagi XXE漏洞练习题
    题目地址:BUUCTF在线评测这道题就是简单的xxe漏洞的注入。进来之后我们进行一个信息收集,在upload下可以看到有个here的超链接。点进去之后得到了如下的一些信息。可以猜到是需要我们利用文件上传包含xxe漏洞利用来得到flag。<?xmlversion='1.0'?><!DOCTYPEusers[<!ENT......
  • 用python写一个脚本,读取srt文件中的内容,并打印出重复的内容,且将不重复的内容保存到新
    代码:#定义一个函数来处理文件defprocess_file(src_filename,unique_filename):seen=set()duplicates=set()withopen(src_filename,'r',encoding='utf-8')asfile:forlineinfile:#将读取的行转换为小写,以避免大小写差异导......
  • 【Python_GUI】tkinter常用组件——文本类组件
    文本时窗口中必不可少的一部分,tkinter模块中,有3种常用的文本类组件,通过这3种组件,可以在窗口中显示以及输入单行文本、多行文本、图片等。Label标签组件Label组件的基本使用Label组件是窗口中比较常用的组件,通常用于添加文字或图片,还可以定义Label组件中文字和图片的排列方式......
  • 2024年06月CCF-GESP编程能力等级认证Python编程三级真题解析
    本文收录于专栏《Python等级认证CCF-GESP真题解析》,专栏总目录:点这里,订阅后可阅读专栏内所有文章。一、单选题(每题2分,共30分)第1题小杨父母带他到某培训机构给他报名参加CCF组织的GESP认证考试的第1级,那他可以选择的认证语言有几种?()A.1B.2C.3D.4答案:C第......
  • 生产实习--启明星辰 第四天(Web网络安全基础知识,sql注入,xss攻击,csrf与ssrf,xxe攻击,未授
    web安全的基础知识基本定义Web安全,也称为网络安全或在线安全,是指保护网站、网页和Web服务免受各种威胁和攻击的技术和实践。这些威胁可能来自恶意软件、网络攻击、数据泄露、身份盗窃、服务中断等。Web安全的目标是确保Web应用程序和用户数据的安全、完整和可用性。一般流程......
  • python基础---元组
    元组1.什么是元组(tuple)元组是容器型数据类型,将()作为容器的标志,里面多个元素用逗号隔开:(数据1,数据2,数据3,…)元组是不可变的;元组是有序的元组的元素可以是任何类型的数据t1=(10,20,30)print(t1)#(10,20,30)#空元组t1=()print(t1)#()#只......