74、探索Python ORM:SQLAlchemy与Peewee实战解析

Python 开发:学习 ORM 框架(如 SQLAlchemy、Peewee)的使用

引言

在进行软件开发时,数据库操作是不可或缺的一部分。而在 Python 中,ORM(Object-Relational Mapping,对象关系映射)框架提供了一种方便的方式来操作数据库。本篇文章将介绍两种流行的 ORM 框架:SQLAlchemy 和 Peewee 的使用,帮助读者快速上手并掌握它们的基本操作。

SQLAlchemy 简介

SQLAlchemy 是一款功能强大的 ORM 框架,它将 Python 对象映射到数据库表,从而使开发者能够以更简单的方式操作数据库。SQLAlchemy 提供了丰富的功能,如查询、关联、事件等,可以满足各种复杂的数据库操作需求。

应用场景

假设我们有一个需求,需要开发一个博客系统,其中包含用户、文章和评论等实体。使用 SQLAlchemy,我们可以很容易地将这些实体映射为数据库表,并进行操作。

实用技巧

  1. 会话管理: SQLAlchemy 通过 Session 对象来管理数据库会话。在操作数据库时,我们首先需要创建一个 Session 对象,然后将其用于执行数据库操作。操作完成后,记得关闭会话。
    from sqlalchemy.orm import sessionmaker
    Session = sessionmaker(bind=engine)
    session = Session()
    
  2. 查询操作: SQLAlchemy 提供了丰富的查询功能,如过滤、排序、分页等。例如,要查询某个用户的全部文章,可以使用以下代码:
    user = session.query(User).filter_by(name='John').first()
    user.articles
    
  3. 关联操作: 如果实体之间存在关联关系,SQLAlchemy 可以很容易地实现关联操作。例如,要查询某个用户的评论,可以使用以下代码:
    comments = session.query(Comment).filter_by(article_id=article.id).all()
    

案例实操

下面是一个简单的案例,实现用户和文章的创建:

  1. 定义模型: 首先定义用户(User)和文章(Article)模型,并与数据库表进行映射。
    from sqlalchemy import Column, Integer, String, ForeignKey
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.orm import relationship
    Base = declarative_base()
    class User(Base):
        __tablename__ = 'users'
        id = Column(Integer, primary_key=True)
        name = Column(String)
    class Article(Base):
        __tablename__ = 'articles'
        id = Column(Integer, primary_key=True)
        title =
  • 24
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用 FastAPI 中 Tortoise-ORMSQLAlchemypeewee 进行 ORM 查询的示例。 ## Tortoise-ORM ```python from fastapi import FastAPI from tortoise import fields from tortoise.contrib.fastapi import register_tortoise, HTTPNotFoundError from tortoise.models import Model from tortoise import Tortoise class User(Model): id = fields.IntField(pk=True) name = fields.CharField(50) email = fields.CharField(50) class Meta: table = "users" app = FastAPI() @app.on_event("startup") async def startup(): await Tortoise.init( db_url="sqlite://db.sqlite3", modules={"models": ["main"]} ) await Tortoise.generate_schemas() @app.on_event("shutdown") async def shutdown(): await Tortoise.close_connections() @app.get("/users") async def get_users(): users = await User.all() return users @app.get("/users/{user_id}") async def get_user(user_id: int): user = await User.get_or_none(id=user_id) if user is None: raise HTTPNotFoundError return user register_tortoise( app, db_url="sqlite://db.sqlite3", modules={"models": ["main"]}, generate_schemas=True, add_exception_handlers=True ) ``` ## SQLAlchemy ```python from fastapi import FastAPI from sqlalchemy import create_engine, Column, Integer, String from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True, index=True) name = Column(String(50)) email = Column(String(50)) engine = create_engine("sqlite:///db.sqlite3") SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) app = FastAPI() @app.get("/users") async def get_users(): db = SessionLocal() users = db.query(User).all() db.close() return users @app.get("/users/{user_id}") async def get_user(user_id: int): db = SessionLocal() user = db.query(User).filter(User.id == user_id).first() db.close() if user is None: raise HTTPNotFoundError return user ``` ## peewee ```python from fastapi import FastAPI from peewee import SqliteDatabase, Model, CharField, IntegerField from playhouse.shortcuts import model_to_dict db = SqliteDatabase("db.sqlite3") class User(Model): id = IntegerField(primary_key=True) name = CharField() email = CharField() class Meta: database = db table_name = "users" app = FastAPI() @app.on_event("startup") def startup(): db.connect() db.create_tables([User]) @app.on_event("shutdown") def shutdown(): db.close() @app.get("/users") async def get_users(): users = [model_to_dict(user) for user in User.select()] return users @app.get("/users/{user_id}") async def get_user(user_id: int): user = User.get_or_none(User.id == user_id) if user is None: raise HTTPNotFoundError return model_to_dict(user) ``` 注意:以上示例中的代码仅用于演示 ORM 查询的基本用法,并且没有进行错误处理。在实际应用中,你应该根据需要添加适当的错误处理和安全性检查。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值