Python面试题:结合Python技术,如何使用SQLAlchemy进行数据库操作

使用SQLAlchemy进行数据库操作是一种非常灵活和强大的方式,它支持多种关系型数据库,并提供了ORM(对象关系映射)和核心(SQL Expression Language)两种使用方法。以下是详细的步骤和示例,展示如何在Python中使用SQLAlchemy进行数据库操作。

1. 安装SQLAlchemy

首先,确保你已经安装了SQLAlchemy和相应的数据库驱动程序。例如,对于SQLite,你只需要安装SQLAlchemy,但对于PostgreSQL,你需要安装psycopg2

pip install sqlalchemy
pip install psycopg2-binary  # 如果使用PostgreSQL

2. 创建数据库连接

使用SQLAlchemy创建数据库连接和会话。

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmakerDATABASE_URL = "postgresql://user:password@localhost/dbname"  # 替换为你的数据库URLengine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

3. 定义模型

使用SQLAlchemy的ORM定义模型。

from sqlalchemy import Column, Integer, String, Float
from sqlalchemy.ext.declarative import declarative_baseBase = declarative_base()class Item(Base):__tablename__ = 'items'id = Column(Integer, primary_key=True, index=True)name = Column(String, index=True)description = Column(String, index=True)price = Column(Float)tax = Column(Float)

4. 创建数据库表

创建表结构:

Base.metadata.create_all(bind=engine)

5. 数据库操作

使用会话进行增删改查操作。

创建会话
db = SessionLocal()
插入数据
new_item = Item(name="Test Item", description="A test item", price=10.99, tax=1.50)
db.add(new_item)
db.commit()
db.refresh(new_item)  # 获取插入后的数据,包括自增ID
print(new_item.id)
查询数据
items = db.query(Item).all()
for item in items:print(item.name, item.price)# 查询单个记录
item = db.query(Item).filter(Item.id == 1).first()
print(item.name, item.price)
更新数据
item = db.query(Item).filter(Item.id == 1).first()
item.price = 12.99
db.commit()
删除数据
item = db.query(Item).filter(Item.id == 1).first()
db.delete(item)
db.commit()

6. 异步支持(使用SQLAlchemy 1.4+)

SQLAlchemy 1.4+ 支持异步操作。需要使用 asyncioasyncpg 驱动。

pip install asyncpg
pip install sqlalchemy[asyncio]

创建异步引擎和会话:

from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
from sqlalchemy.orm import sessionmakerDATABASE_URL = "postgresql+asyncpg://user:password@localhost/dbname"engine = create_async_engine(DATABASE_URL, echo=True)
AsyncSessionLocal = sessionmaker(bind=engine, class_=AsyncSession, expire_on_commit=False)

异步操作示例:

import asyncioasync def main():async with AsyncSessionLocal() as session:async with session.begin():new_item = Item(name="Async Item", description="An async item", price=10.99, tax=1.50)session.add(new_item)await session.commit()async with session.begin():result = await session.execute(select(Item).where(Item.name == "Async Item"))item = result.scalars().first()print(item.name, item.price)asyncio.run(main())

7. 使用SQL Expression Language

除了ORM,SQLAlchemy还提供了SQL Expression Language用于构建原生SQL查询。

from sqlalchemy import Table, MetaData, selectmetadata = MetaData()
items_table = Table('items', metadata, autoload_with=engine)with engine.connect() as conn:query = select([items_table]).where(items_table.c.name == 'Test Item')result = conn.execute(query)for row in result:print(row)

总结

通过以上步骤,你可以使用SQLAlchemy在Python中进行灵活的数据库操作。从基本的ORM模型定义、创建数据库表、数据增删改查到异步支持和原生SQL查询,SQLAlchemy提供了丰富的功能和灵活性,适用于各种数据库操作需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/51477.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

虚拟机Ubuntu20.04 利用串口调试机械臂

虚拟机Ubuntu20.04 利用串口调试机械臂 串口库问题 由于机械臂使用的是串口进行驱动控制,在python中相关的串口库为serial和pyserial两个,这里我曾踩过雷同时安装了serial与pyserial两个库,导致报错如下所示: AttributeError: m…

数据结构:(1)线性表

一、基本概念 概念:零个或多个数据元素的有限序列 元素之间是有顺序了。如果存在多个元素,第一个元素无前驱,最后一个没有后继,其他的元素只有一个前驱和一个后继。 当线性表元素的个数n(n>0&am…

c++中grpc简单使用---函数介绍及其代码演示

前言 C gRPC(Google Remote Procedure Call)是一种高性能、开源的远程过程调用框架,用于在不同服务之间进行通信。 配置gRPC可以访问该网站:grpc配置 一.函数介绍 下面是一些常见的 C gRPC 函数及其功能: grpc::Cha…

Centos的YUM源

可以使用以下几个常见的YUM源,这些源通常具有较快的速度和较高的可用性: 阿里云 (Aliyun) [aliyun] nameAliyun mirrors baseurlhttp://mirrors.aliyun.com/centos/$releasever/os/$basearch/ gpgcheck1 gpgkeyhttp://mirrors.aliyun.com/centos/RPM-GPG…

使用Spring Boot与Spire.Doc实现Word文档的多样化操作

​ 博客主页: 南来_北往 系列专栏:Spring Boot实战 前言 使用Spring Boot与Spire.Doc实现Word文档的多样化操作具有以下优势: 强大的功能组合:Spring Boot提供了快速构建独立和生产级的Spring应用程序的能力,而Spire.Doc则…

【Golang 面试 - 进阶题】每日 3 题(二)

✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/UWz06 📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏…

【Docker】搭建实用的内网穿透工具 - FRP

前言 本教程基于群晖的NAS设备DS423+的docker功能进行搭建FRP的客户端,DSM版本为 7.2.1-69057 Update 5。采用香港机Debian 12系统的服务器来安装FRP的服务端作为演示。 服务器购买地址:https://www.crash.work/aff/AQXGDNKY 简介 FRP(Fast Reverse Proxy)是一个高性能…

OSError: You are trying to access a gated repo.解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

『 Linux 』用户态与内核态的转换机制及信号检测时机

文章目录 用户态与内核态进程地址空间操作系统的本质 信号的处理时机 用户态与内核态 进程在执行代码的过程中代码必定涉及用户代码,库函数代码及操作系统内核代码; 以简单的printf()函数为例,该函数必定为先执行用户的代码即知道需要调用printf()函数,再执行库(如libc)中的代码…

这六种灯千万别买了!看你踩了几个坑

雅静说啥样的灯买了才发现是个坑      给你说6个,安上就会后悔的      1,这些变色的灯就别要了,说的是三色温灯,买回家才发现      它的白光,暖光,中性光,我们习惯只用一种,开,关,开,关,开5次      才能调到自己想要的档位,不想患上关节炎就别买这种了     …

Java线程同步与通信:wait(), notify(), notifyAll(), sleep()

Java线程同步与通信:wait(), notify(), notifyAll(), sleep() 1. wait()2. notify()3. notifyAll()4. sleep()4、总结 💖The Begin💖点点关注&…

一文带你读懂TCP

文章目录 1 TCP协议1.1 TCP 基础1.1.1 TCP 特性1.2.2 TCP连接数 1.2 TCP 头1.2.1 TCP 头格式1.2.2 MTU,MSS,分片传输 1.3 TCP 连接三路握手1.4 TCP 断开四次挥手1.5 SYN攻击和防范1.6 重传机制1.6.1 超时重传1.6.2 快速重传1.6.3 SACK 1.7 滑动窗口1.8 流…

微信小程序根据动态权限展示tabbar

微信小程序自定义 TabBar 后根据权限动态展示tabbar 在微信小程序开发中,自定义 TabBar 可以让应用更具灵活性和个性化。特别是在用户根据不同权限展示不同的 TabBar 内容时,正确的实现方法能够提升用户体验。本篇文章将分享如何使用事件总线实现权限变动时动态更新自定义 T…

软件环境安装-通过Docker安装rabbitmq

软件环境安装-通过Docker安装rabbitmq 一、拉取镜像二、启动三、安装延迟队列插件 一、拉取镜像 docker pull rabbitmq:3.9.0-management二、启动 docker run -d --namerabbitmq --restartalways -p 5672:5672 -p 15672:15672 rabbitmq:3.9.0-management 三、安装延迟队列插…

Linux基础复习(二)

前言 本文介绍了一下Linux命令行基本操作及网络配置 一、 命令行提示含义 [当前用户主机名 工作目录]$ 若当前用户是root,则最后一个字符为# 否则,最后一个字符为$ 二、常用Linux命令及其解释 修改主机名 一般在创建一台主机后会使用hostname相关命…

在生信分析中大家需要特别注意的事情​

在生信分析中大家需要特别注意的事情 标准的软件使用和数据分析流程 1. 先看我的b站教学视频 2. 先从我的百度网盘把演示数据集下载下来,先把要运行的模块的演示数据集先运行一遍 3. 前两步都做完了,演示数据集也运行成功了,并且知道了软件…

服务器构建私有npm库(Docker + Verdaccio)

npm官网有时候因为网络原因包推不上去,那就简单构建个私有库 私有库不会被共享,且配置不需要太高1h2G就行 1.需要安装Docker,这个跳过了 2.生成配置文件 mkdir /home/verdaccio cd /home/verdaccio mkdir conf && mkdir storage &am…

ajax请求成功但不执行success-function回调函数

目录 一、问题分析 二、处理问题 一、问题分析 在测试员工管理系统的登录和注册代码时,登录一切正常,就是注册成功后没有跳转页面,后面发现是success-function回调函数没有正常执行。原因主要是前端和后端交流的数据格式不一致,…

【C++BFS算法 二分查找】2812. 找出最安全路径

本文涉及知识点 CBFS算法 C二分查找 LeetCode2812. 找出最安全路径 给你一个下标从 0 开始、大小为 n x n 的二维矩阵 grid ,其中 (r, c) 表示: 如果 grid[r][c] 1 ,则表示一个存在小偷的单元格 如果 grid[r][c] 0 ,则表示一…

Windows配置AirSim过程(学习过程)

一、概述 因为需要在虚幻引擎当中使用AirSim,在Windows系统上进行操作,根据官方网站的操作过程,进行了配置,这里作为自己配置过程的记录。 二、具体过程 (一)系统版本 操作系统是Windows11,Ai…