【杂记】SQLAlchemy使用方法记录

目录

  • 写在前面
  • 1. 什么是SQLAlchemy
  • 2. 安装SQLAlchemy
  • 3. 使用方法
    • 3.1 初始化数据库连接
    • 3.2 创建表
      • 3.2.1 基础创建表操作
      • 3.2.2 常用表字段属性代码
      • 3.2.3 建立数据库表关系
        • (1)一对多
        • (2)多对多
    • 3.3 查询数据
      • 3.3.1 通用的查询数据方法
      • 3.3.2 过滤规则
    • 3.4 向数据表中添加/删除/更改数据
      • 3.4.1 添加数据
      • 3.4.2 删除数据
      • 3.4.3 更改数据
  • 参考


写在前面

仅作个人学习与记录用。主要整理SQLAlchemy数据库访问与操作的方法。

1. 什么是SQLAlchemy

SQLAlchemy是Python SQL工具包和ORM框架,它为应用程序开发人员提供了SQL的全部功能。

它提供了一套众所周知的企业级持久性模式,这些模式是为高效和高性能的数据库访问而设计的,并被改编成一种简单的python域语言。

本文主要聚焦于SQLAlchemy在以下场景中的初级使用方法:

  • 数据库访问和操作:SQLAlchemy提供了高层抽象来操作数据库,可以避免写原生SQL语句。支持多种数据库后端。
  • ORM映射:建立Python类与数据库表的映射关系,简化数据模型的操作,支持声明式操作。

2. 安装SQLAlchemy

终端直接pip下载安装即可:

pip install SQLAlchemy

3. 使用方法

3.1 初始化数据库连接

要对数据库进行访问和操作,首先要连接目标数据库,代码如下:

from sqlalchemy import create_engine
db = create_engine('mysql+pymysql://', 
connect_args={'user': '用户名',
'password': '密码',
'host': '数据库地址',
'port': 3306,
'database': '数据库名',
'charset': 'utf8'})                                                                                                                                                                      

其中,connect_args是连接信息:user和password分别是数据库所在的MySQL的账号和密码,host和port是MySQL服务器的地址和端口号,database是要连接的数据库名称,charset是编码方式。

或者使用URL的方式填写连接数据库所需的信息。如下代码所示:

db = create_engine('mysql+pymysql://[用户名]:[密码]@127.0.0.1:3306/[数据库名]?charset=utf8'

3.2 创建表

3.2.1 基础创建表操作

需要注意的是,对数据库进行任何操作都需要先建立映射关系。创建数据表的代码如下:

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, Text, VARCHAR, DateTime,.....
from sqlalchemy import create_engine
import datetime
# 获取数据库实例
db = create_engine('mysql+pymysql://[用户名]:[密码]@127.0.0.1:3306/[数据库名]?charset=utf8'# 建立映射关系
Base = declarative_base()
class User(Base):__tablename__ = 'users'  # 设置表名id = Column(Integer, primary_key=True) # id列,类型是Integer,主键name = Column(String(32), index=True, nullable=False) # name列varchar32,索引,不可为空age = Column(Integer) # age列ctime = Column(DateTime, default=datetime.datetime.now) # ctime列,类型是时间,datetime.datetime.now是录入的时间不能加括号,加了括号,以后永远是当前时间extra = Column(Text, nullable=True, unique=True) # extra列,文本类型,允许空值,重复出现的记录仅保留一条# 创建表
Base.metadata.create_all(db)

运行上述的代码后会在数据库中创建一个名为users的表。如果需要创建多个表,只需要创建多个类即可。

3.2.2 常用表字段属性代码

SQLAlchemy 创建表时,如3.2.1代码所示,需要使用许多属性来规定表的字段的属性和行为,常用的属性如下:

属性功能
Column声明一个列
String字符串类型,参数为指定字符串的最大长度,通常用于存储短文本、用户名等字符串类型的数据
Text文本类型,用于存储大块文本
Integer整数类型,通常用于存储数值类型的 ID 编号等
Float浮点数类型,用于存储浮点类型的数据
Boolean布尔类型,用于存储布尔类型的数据
DateTime日期和时间类型,用于存储日期和时间信息
Date日期类型,用于存储日期信息
Time时间类型,用于存储时间信息
ForeignKey外键类型,用于定义外键关系
relationship定义 ORM 关系模型中的关系类型
back_populates定义反向引用的属性名称
primary_key=True指示该列是主键列
unique=True指定该列的值必须是唯一的
default指定该列的默认值
nullable=False指定该列的值不能为空

3.2.3 建立数据库表关系

(1)一对多

一对多的关系是一种特殊的多对多的关系,例如一个用户可以有多个电话号码,即表users中的一条记录能够对应另一张表phone_number中的多条记录,而表phone_number中的一条记录只能对应表users中的一条记录。

代码如下:

from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationshipclass User(Base):__tablename__ = 'users' ...# 增加一个字段关系,User类通过Phone_number字段找到Phone_number类# 如果使用 back_populates 参数来代替 backref 参数,则Phone_number类需要被注释掉的那一行phone_number = db.relationship('Phone_number', backref='users')class Phone_number(Base):__tablename__ = 'phone_numbers'id = Column(Integer, primary_key=True)email_address = Column(String, nullable=False)user_id = Column(Integer, ForeignKey('users.id'))# user = relationship("User", back_populates="phone_numbers")

relationship函数的目的是让 phone_number类链接到User类,back_populates参数表示引用的互补属性名,也就是本身的表名。back_ref参数表示父表的表名。

ForeignKey即是外键,定义了两表的两列之间依赖关系,表示关联了表usersid和表phone_numbers

需要注意:

  • 一对多关系中,多的一方使用Foreignkey,一的一方使用relationship。

  • 如果是一对一的对应关系,则relationship函数增加参数uselist=False即可。

(2)多对多

多对多关系可以举如下例子:建立一个用户与群组的表,一个用户对应多个群组,一个群组中也有多个用户。

需要引入第三张表作为中间表。代码如下:

# 中间表
class UserToGroup(Base):__tablename__ = "user_to_group"id = db.Column(db.Integer,primary_key=True)user_id = db.Column(db.Integer, db.ForeignKey("users.id"))group_id = db.Column(db.Integer, db.ForeignKey("groups.id"))# 表users
class User(Base):__tablename__ = 'users'  # 设置表名id = Column(Integer, primary_key=True) # id列,类型是Integer,主键...group = db.relationship("Group", secondary="user_to_group", back_populates="user")# 表groups
class Group(Base):__tablename__ = "groups"id = db.Column(db.Integer, primary_key=True)...user = db.relationship("User", secondary="user_to_group", back_populates="group")

3.3 查询数据

3.3.1 通用的查询数据方法

以上面创建的数据表users(class User)为例。代码如下:

Session = sessionmaker(db)
session = Session()User.query.<过滤方法(非必要)>.<返回方法># 提交数据,将数据保存到数据库中
session.commit()
# 关闭会话
session.close()

常用的过滤方法如下:

过滤方法说明
filter(name = '张三')使用指定的规则过滤记录,返回新产生的查询对象
filter_by('User.name == '张三')使用指定规则过滤记录(以关键字表达式的形式),返回新产生的查询对象,只能用=符号,不能用!=,>,<。
order_by()根据指定条件对记录进行排序,返回新产生的查询对象
group_by()根据指定条件对记录进行分组,返回新产生的查询对象
limit()

常用的返回方法如下:

返回方法说明
all()返回包含所有查询记录的列表
first()返回查询的第一条记录,如果未找到,则返回None
get(name)传入主键值作为参数,返回指定主键值的记录,如果未找到,则返回None
count()返回查询结果的数量
first_or_404()返回查询的第一条记录,如果未找到,则返回404错误响应
first_or_404()传入主键值作为参数,返回指定主键值的记录,如果未找到,则返回404错误响应
paginate()返回一个Pagination对象,可以对记录进行分页处理

3.3.2 过滤规则

有like过滤、is过滤、正则过滤等规则。

详细的过滤规则可以参考:《Python SQLalchemy 基础操作之数据库增删改查》或者《Python ORM之SQLAlchemy全面指南》的第十一节

3.4 向数据表中添加/删除/更改数据

以上面创建的数据表users(class User)为例。使用url网络请求数据。

3.4.1 添加数据

# 插入多条记录
obj = [User(name='张三', ...),User(name='李四', ...),User(name='王五', ...)]
# 创建会话
obj_session = sessionmaker(db)
# 打开会话
db_session = obj_session()
# 向表中添加数据,此时数据保存在内存中
db_session.add_all(obj)
# 提交数据,将数据保存到数据库中
db_session.commit()
# 关闭会话
db_session.close()

3.4.2 删除数据

Session = sessionmaker(db)
session = Session()
users = User.query.all()# 删除满足给定条件'id=1'的第一条记录
user = session.query(User).filter_by(id=1).first()
session.delete(user)# 删除满足给定条件'id=1'的所有记录
session.query(User).filter_by(id=1).delete()# 删除所有记录
session.query(User).delete()# 提交数据,将数据保存到数据库中
session.commit()
# 关闭会话
session.close()

3.4.3 更改数据

Session = sessionmaker(db)
session = Session()
users = User.query.all()# 更新满足给定条件'id=1'的第一条记录
user = session.query(User).filter_by(id=1).first()
user.name = 'new name'# 更新所有记录
session.query(User).update({'name': 'new name'})# 提交数据,将数据保存到数据库中
session.commit()
# 关闭会话
session.close()

参考

[1] SQLAlchemy官网
[2] 《SQLAlchemy查询语句(新手入坑)》
[3] 《python—sqlalchemy简单使用方法,一对多,多对多,双向关系教程》
[4] 《Python SQLalchemy 基础操作之数据库增删改查》
[5] 《Python ORM之SQLAlchemy全面指南》

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

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

相关文章

【Java网络编程】HTTP超文本传输协议

一、HTTP超文本传输协议 HTTP全称为Hyper Text Transfer Protocol超文本传输协议&#xff0c;它是基于TCP传输协议构建的应用层协议&#xff0c;作为支撑万维网www的核心协议&#xff0c;为了保证其效率及处理大量事务的能力&#xff0c;因此在设计时&#xff0c;HTTP被制定成为…

机器学习软件perming的使用文档

perming 本文作者的Github账号是linjing-lab,PyPI账户是DeeGLMath perming: Perceptron Models Are Training on Windows Platform with Default GPU Acceleration. p: use polars or pandas to read dataset.per: perceptron algorithm used as based model.m: models includ…

lua学习笔记5(分支结构和循环的学习)

print("*****************分支结构和循环的学习******************") print("*****************if else语句******************") --if 条件 then end a660 b670 --单分支 if a<b thenprint(a) end --双分支 if a>b thenprint("满足条件")…

C#操作MySQL从入门到精通(5)——查询数据

前言 在和MySql数据库交互的过程中,查询数据是使用最频繁的操作,本文详细介绍了查询数据的各种操作,包括查询一列数据、 查询两列数据、查询所有列数据、查询不重复的数据、查询指定行数据,绝对是C#操作MySql数据库史上最详细教程,能够帮助小白快速入门以及将这些功能迅速…

京东云4C8G服务器优惠价格418元1年,轻量云主机4核8G配置

京东云服务器优惠活动4C8G服务器配置418元一年&#xff0c;1899元3年&#xff0c;配置为轻量云主机4C8G-180G SSD系统盘-5M带宽-500G月流量&#xff0c;京东云服务器活动页面 jdyfwq.com 可以查看京东云服务器详细配置和精准报价单&#xff0c;活动打开如下图&#xff1a; 轻量…

sharding‐jdbc之分库分表实战

数据库表结构 店铺数据库 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------------------------- -- Table structure for region -- ---------------------------- DROP TABLE IF EXISTS region; CREATE TABLE region (id bigint(20) NOT NULL COMMENT id,region_…

上位机图像处理和嵌入式模块部署(qmacvisual实时视频)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们测试和练习的时候&#xff0c;大部分情况下都是利用图像进行测试的&#xff0c;但是实际情况下&#xff0c;或者准确一点说&#xff0c;工…

android 制作登录页

项目需要可以直接copy layout.xml <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"…

华为汽车的“计算+通信”电子电气架构

文章目录 整车结构 硬件平台 软件平台 总结展望 整车EEA&#xff08;电子电气架构&#xff09;&#xff0c;按照博世提出的演进路径&#xff0c;大致可以划分为四个阶段&#xff1a;分布式模块阶段、区域控制阶段、中央计算阶段、云计算阶段。示例如下&#xff1a; 本文选取…

【Node.js】短链接

原文链接&#xff1a;Nodejs 第六十二章&#xff08;短链接&#xff09; - 掘金 (juejin.cn) 短链接是一种缩短长网址的方法&#xff0c;将原始的长网址转换为更短的形式。短链接的主要用途之一是在社交媒体平台进行链接分享。由于这些平台对字符数量有限制&#xff0c;长网址可…

c# wpf LiveCharts 绑定 简单试验

1.概要 c# wpf LiveCharts 绑定 简单试验 2.代码 <Window x:Class"WpfApp3.Window2"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schem…

K8S基于containerd做容器从harbor拉取镜

实现创建pod时&#xff0c;通过指定harbor仓库里的镜像来运行pod 检查&#xff1a;K8S是不是用containerd做容器运行时&#xff0c;以及containerd的版本是不是小于1.6.22 kubectl get nodes -owide1、如果containerd小于 1.6.22&#xff0c;需要先升级containerd 先卸载旧的…

Note-模型的特征学习过程分析

模型的学习过程 将数据的特征分为,有用特征和无用特征(噪声).有用特征与任务有关,无用特征与任务无关. 模型的学习过程就是增大有用特征的权重并减少无用特征的权重的过程. 神经网络反向传播过程简化如下: y a 0 x 0 a 1 x 1 , l o s s 0.5 ∗ ( y l a b e l − y ) 2 y …

数据结构和算法:分治

分治算法 分治&#xff08;divide and conquer&#xff09;&#xff0c;全称分而治之&#xff0c;是一种非常重要且常见的算法策略。分治通常基于递归实现&#xff0c;包括“分”和“治”两个步骤。 1.分&#xff08;划分阶段&#xff09;&#xff1a;递归地将原问题分解为两个…

DNFOMP:杂乱环境中自动驾驶汽车导航的动态神经场最优运动规划器

DNFOMP&#xff1a;杂乱环境中自动驾驶汽车导航的动态神经场最优运动规划器 附赠自动驾驶学习资料和量产经验&#xff1a;链接 摘要 本文介绍了DNFOMP&#xff1a;杂乱环境中自动驾驶汽车导航的动态神经场最优运动规划器。动态变化环境中的运动规划是自动驾驶中最复杂的挑战之…

cycle GAN

import os os.environ[TF_CPP_MIN_LOG_LEVEL] = 2#设置tensorflow的日志级别 from tensorflow.python.platform import build_info import tensorflow as tf # 列出所有物理GPU设备 gpus = tf.config.list_physical_devices(GPU) if gpus: # 如果有GPU,设置GPU资源…

【学习分享】小白写算法之插入排序篇

【学习分享】小白写算法之插入排序篇 前言一、什么是插入排序算法二、插入排序算法如何实现三、C语言实现算法四、复杂度计算五、算法稳定性六、小结 前言 要学好每个算法&#xff0c;我觉得需要先总结出规律&#xff0c;然后自己去推演一遍&#xff0c;加深记忆&#xff0c;否…

【Java设计模式】创建型——抽象工厂模式

目录 背景/问题解决方案&#xff1a;抽象工厂模式解析生活场景模拟上一章的案例图解 意图主要解决何时使用如何解决关键代码抽象工厂模式涉及多个角色&#xff1a; 代码示例优点缺点应用场景 背景/问题 在某些情况下&#xff0c;需要创建一系列相关或相互依赖的对象&#xff0…

线程池详解并使用Go语言实现 Pool

写在前面 在线程池中存在几个概念&#xff1a;核心线程数、最大线程数、任务队列。 核心线程数指的是线程池的基本大小&#xff1b;也就是指worker的数量最大线程数指的是&#xff0c;同一时刻线程池中线程的数量最大不能超过该值&#xff1b;实际上就是指task任务的数量。任务…

MacOS下载和安装HomeBrew的详细教程

在MacOS上安装Homebrew的详细教程如下&#xff1a;&#xff08;参考官网&#xff1a;macOS&#xff08;或 Linux&#xff09;缺失的软件包的管理器 — Homebrew&#xff09; 步骤1&#xff1a;检查系统要求 确保你的MacOS版本至少为macOS Monterey (12) (or higher) 或更高版本…