Python数据库ORM框架SQLALchemy操作数据库简单封装表关系(一对一、一对多、多对多)增删改查crud工具

SQLALchemy

SQLALchemy是python下操作数据库的工具包,是一个数据库ORM(对象关系映射)框架,使用SQLALchemy可以极大的简化对数据库和数据的操作,使用ORM管理数据更直观方便.这里我记录一次关于sqlalchemy使用的简单实践,包括了创建数据库连接、定义模型、表关系(一对一、一对多、多对多)增删改查、crud工具,最后使用了pytest进行了一些测试.

创建项目

项目文件

首相创建一个项目目录,包括一下文件:
database.py 数据库创建和连接的配置文件
models.py 模型 定义表和关系
crud.py crud的操作封装工具
test_db.py 项目的测试文件

Python数据库ORM框架SQLALchemy操作数据库简单封装表关系(一对一、一对多、多对多)增删改查crud工具

; 安装SQLALchemy

终端输入:

pip install sqlalchemy

进入python的交互模式下检测版本:

>>> import sqlalchemy
>>> sqlalchemy.__version__
1.4.0

创建数据库和数据库的连接

database.py 的代码如下:

import os,sys
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
DB_DIR = os.path.join(BASE_DIR, 'data.db')

SQLALCHEMY_DATABASE_URL = "sqlite:///" + DB_DIR

engine = create_engine("sqlite+pysqlite:///:memory:", echo=False, future=True)

Base = declarative_base()

SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

def get_db():
    db = SessionLocal()
    try:
        return db
    finally:
        db.close()

if __name__ == '__main__':
    db = get_db()
    print(dir(db))

最后可以运行这个文件,打印获得的数据库连接的属性,如果看到了一堆属性就是成功连接,看代码中的注释应该就能了解个大概了,这里就不一一介绍了.

定义模型

models.py 的部分代码如下,以为代码太长了,文末留有代码仓库地址.

from database import Base
from sqlalchemy import String, Column, Integer, DateTime, Enum, Table, ForeignKey
from sqlalchemy.orm import relationship

class User(Base):
    __tablename__ = 'user'
    id = Column(Integer, primary_key=True)
    username = Column(String(100), nullable=False, index=True)

    userdata = relationship('UserData',uselist=False,back_populates='user')

    articles = relationship('Article',uselist=True,back_populates='user')

首先头部引入相关的依赖,比如database中Base,这个是定义model的基类,引入表的字段类型,还有relationship是用来定义表关系的方法.

关系使用 relationship() 函数表示。然而外键必须用类ForeignKey来单独声明. 这里的一对一关系使用User(用户基本资料)和UserData(用户的拓展资料),如果需要给用户的基本资料添加一写拓展资料,这种关系必须是一对一的关系。这里我们假设需要为用户添加一个邮件的拓展资料,分别定义用户User和UserData模型,并使用关系方法定义他们之间的一对一关系.

uselist=False 标志指示在关系的”多”端放置标量属性而不是集合。将一对多转换为一对一, back_populates() 显示表明双方的对应关系,这种方法比较简单。

一对多和一对一关系基本相似,去掉 uselist=False 就可以了,这里user和article为一堆多关系.

多对多关系,您需要定义一个用于关系的辅助表。对于这个辅助表, 强烈建议不使用模型,而是采用一个实际的表(但是我就建立了一个模型,具体参看代码,感觉也没什么影响?有大佬知道这其中的奥秘么?)。这里使用了 Article 和 Tag 之间的多对多关系,一个文章可以有多个标签,一个标签下也可以有多个文章。关系辅助表article_tag一定要在模型表之前定义,不然创建表的时候容易报错。

crud的封装

把一些常用的crud封装起来,使用的时候更方便,这里我只是封装了几个测试的,大家可以根据自己的需求进行封装.

from sqlalchemy.orm import Session
from models import *

def get_user(db:Session,username:str):
    return db.query(User).filter(User.username==username).first()

def get_users(db:Session,skip:int = 0,limit:int=100):
    return db.query(User).all()

def get_articles(db:Session,skip:int = 0,limit:int=10):
    return db.query(Article).offset(skip).limit(limit).all()

测试

最后使用pytest测试了一下整个项目的crud和crud的封装的方法,直接运行测试文件,即可看到测试的结果,具体代码就不贴啦,最后放一张数据库表的er图,大家可以结合图中的关系理解一下.

Python数据库ORM框架SQLALchemy操作数据库简单封装表关系(一对一、一对多、多对多)增删改查crud工具

本文代码仓库:
https://github.com/bosichong/sqlalchemy-test

Original: https://blog.csdn.net/bosivip/article/details/127860903
Author: J_Sky2022
Title: Python数据库ORM框架SQLALchemy操作数据库简单封装表关系(一对一、一对多、多对多)增删改查crud工具

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/817454/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球