SQLAlchemy模型定义:映射数据库表到Python类

news2024/11/27 19:57:20

SQLAlchemy是一个流行的Python SQL工具包和对象关系映射(ORM)框架,它提供了一个高层的ORM以及底层的SQL表达式语言。使用SQLAlchemy,开发者可以以面向对象的方式来操作数据库,而不必编写复杂的SQL语句。本文将详细介绍如何在SQLAlchemy中定义模型,即将数据库表映射到Python类。
在这里插入图片描述

一、SQLAlchemy简介

SQLAlchemy的核心功能之一就是ORM,它允许开发者以Python类的形式来定义数据库表,然后通过这些类来操作数据库。这种方式使得数据库操作更加直观和易于理解。

1.1 SQLAlchemy的组成

SQLAlchemy主要由以下几个部分组成:

  • Core:提供了底层的SQL构建和执行功能。
  • ORM:提供了对象关系映射功能,允许开发者以面向对象的方式来操作数据库。

1.2 安装SQLAlchemy

要使用SQLAlchemy,首先需要安装它。可以通过pip来安装:

pip install sqlalchemy

二、定义模型

在SQLAlchemy中,定义模型通常涉及以下几个步骤:

2.1 导入必要的模块

首先,需要导入SQLAlchemy中的相关模块:

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

2.2 创建基类

使用declarative_base()来创建一个基类,所有的模型都将继承这个基类:

Base = declarative_base()

2.3 定义模型

定义模型就是创建一个继承自基类的Python类,类中的每个属性对应数据库表的一个列。

class User(Base):
    __tablename__ = 'users'
    
    id = Column(Integer, primary_key=True)
    name = Column(String)
    age = Column(Integer)

三、模型属性

在定义模型时,可以使用不同的属性来定义列:

3.1 主键

primary_key=True用于定义主键。

id = Column(Integer, primary_key=True)

3.2 字符串类型

String用于定义字符串类型的列。

name = Column(String)

3.3 整型

Integer用于定义整型列。

age = Column(Integer)

3.4 自动递增

autoincrement=True用于定义自动递增的列。

id = Column(Integer, primary_key=True, autoincrement=True)

3.5 外键

ForeignKey用于定义外键。

class Post(Base):
    __tablename__ = 'posts'
    
    id = Column(Integer, primary_key=True)
    user_id = Column(Integer, ForeignKey('users.id'))
    title = Column(String)

四、创建和操作数据库

4.1 创建引擎

创建一个数据库引擎,这是与数据库进行交互的入口。

engine = create_engine('sqlite:///example.db')

4.2 创建会话

创建一个会话,用于执行数据库操作。

Session = sessionmaker(bind=engine)
session = Session()

4.3 创建表

使用Base.metadata.create_all(engine)来创建表。

Base.metadata.create_all(engine)

4.4 插入数据

插入数据时,首先创建一个模型的实例,然后添加到会话中并提交。

new_user = User(name='John Doe', age=30)
session.add(new_user)
session.commit()

4.5 查询数据

查询数据时,可以直接使用模型类。

users = session.query(User).filter_by(name='John Doe').all()
for user in users:
    print(user.id, user.name, user.age)

4.6 更新数据

更新数据时,首先查询出要更新的对象,然后修改其属性,最后提交。

user = session.query(User).filter_by(name='John Doe').first()
user.age = 31
session.commit()

4.7 删除数据

删除数据时,首先查询出要删除的对象,然后从会话中删除并提交。

user = session.query(User).filter_by(name='John Doe').first()
session.delete(user)
session.commit()

五、案例分析

5.1 多对多关系

多对多关系可以通过创建一个关联表来实现。

class User(Base):
    __tablename__ = 'users'
    
    id = Column(Integer, primary_key=True)
    name = Column(String)
    roles = relationship("Role", secondary=roles_users_association)

class Role(Base):
    __tablename__ = 'roles'
    
    id = Column(Integer, primary_key=True)
    name = Column(String)
    users = relationship("User", secondary=roles_users_association)

roles_users_association = Table('roles_users', Base.metadata,
    Column('user_id', Integer, ForeignKey('users.id')),
    Column('role_id', Integer, ForeignKey('roles.id'))
)

5.2 继承关系

SQLAlchemy支持单表继承和多表继承。

class Employee(Base):
    __tablename__ = 'employees'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    type = Column(String)

class Manager(Employee):
    __tablename__ = 'managers'
    id = Column(Integer, ForeignKey('employees.id'), primary_key=True)
    employees = relationship("Employee", backref="manager")

六、常见问题

6.1 如何处理事务?

SQLAlchemy使用会话来管理事务,可以通过session.commit()session.rollback()来提交和回滚事务。

6.2 如何优化查询?

可以通过使用索引、查询优化器提示或者编写更高效的查询语句来优化查询。

6.3 如何处理复杂查询?

对于复杂的查询,可以使用SQLAlchemy的join()filter()等方法来构建复杂的查询。

七、总结

SQLAlchemy的ORM功能使得数据库操作更加直观和易于理解。通过定义模型,可以将数据库表映射到Python类,从而以面向对象的方式来操作数据库。本文详细介绍了如何在SQLAlchemy中定义模型,包括模型属性的定义、数据库的创建和操作、以及一些常见的案例分析。希望这篇文章能够帮助新手朋友快速上手SQLAlchemy。

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

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

相关文章

【spring ai】java 实现RAG检索增强,超快速入门

rag 需求产生的背景介绍: 在使用大模型时,一个常见的问题是模型会产生幻觉(即生成的内容与事实不符),同时由于缺乏企业内部数据的支持,导致其回答往往不够精准和具体,偏向于泛泛而谈。这些问题…

如何利用wsl-Ubuntu里conda用来给Windows的PyCharm开发

前提:咱们在wsl-Ubuntu上,有conda的虚拟环境 咱们直接打开PyCharm,打开Settings 更换Python Interpreter即可 当然一开始可能没有下面的选项,需要我们点击右边的Add Interpreter 这里选择wsl 点击next 将这两步进行修改 可以看出来&#xff0…

计算机视觉之OpenCV vs YOLO

好多开发者希望搞明白OpenCV 和YOLO区别,实际上,二者在计算机视觉领域都有广泛应用,但它们有很大的不同。 一、OpenCV 概述 OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它…

继承--C++

文章目录 一、继承的概念及定义1、继承的概念 二、继承定义1、定义格式2、继承基类成员访问方式的变化3、继承类模板 三、基类和派生类间的转换1、继承中的作用域2、隐藏规则: 四、派生类的默认成员函数1、4个常见默认成员函数2、实现⼀个不能被继承的类 五、继承与…

(八)Proteus仿真STM32单片机GPIO驱动数码管

1,参考上篇,将LED点阵屏更换成数码管如下图 2,修改驱动函数,数组seg[14]前10个是0-9数字的编码,后四个是空格,点,横线,下划线 char seg_decode(char num)//数字解码 {const char se…

【华为欧拉】国产OpenEuler服务器系统安装以及图形界面

openEuler下载 | openEuler ISO镜像 | openEuler社区官网 下载安装iso 本次选择4G的社区版本 安装,复制到光盘,光盘引导安装。虚拟机安装,准备好iso文件引用,指定好安装源,安装界面和centOS基本一样。选择最小安装就…

JVM系列(二) -类的加载过程介绍

一、背景介绍 我们知道 Java 是先通过编译器将.java类文件转成.class字节码文件,然后再通过虚拟机将.class字节码文件加载到内存中来实现应用程序的运行。 那么虚拟机是什么时候加载class文件?如何加载class文件?class文件进入到虚拟机后发…

彻底理解TypeScript函数语法

目录 参数类型基本声明默认参数剩余参数可选只读匿名函数回调函数 返回值类型函数类型表达式调用签名构造签名 函数的重载this可推导的编译选项this类型内置工具 函数是JavaScript非常重要的组成部分,TypeScript中也是如此,TypeScript 提供了强大的类型系…

网关在不同行业自动化生产线的应用

网关在不同行业自动化生产线的应用,展示了其作为信息与物理世界交汇点的广泛影响力,尤其在推动行业智能化、自动化方面发挥了不可估量的作用。以下是网关技术在污水处理、智慧农业、智慧工厂、电力改造及自动化控制等领域的深入应用剖析。 1. 污水处理 …

盒子模型的简单运用

1.块内元素与行内元素 HTML_code <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</titl…

Scala面试题大全~基础题(15题)

1&#xff1a;Scala是什么? Scala是一种多范式的编程语言&#xff0c;它结合了面向对象编程和函数式编程的特性&#xff0c;它支持面向对象、函数式和命令式编程方法。Scala运行在Java虚拟机&#xff08;JVM&#xff09;上&#xff0c;这意味着它可以与Java代码无缝集成。它还…

【多版本并发控制(MVCC)】

并发事务问题&#xff1a; MySQL隔离级别-未提交读&#xff0c;提交读&#xff0c;可重复读&#xff0c;序列化 隔离级别对于并发事务的解决情况 隔离级别脏读不可重复读幻读未提交读不可不可不可读已提交可不可不可可重复读 &#xff08;默认&#xff09;可可不可串行化&…

现货黄金价格走势图策略分析 先看“势”

在现货黄金投资市场&#xff0c;对金价走势图的趋势进行分析&#xff0c;是投资者做出明智决策的关键步骤。通过有效的趋势分析&#xff0c;投资者可以更好地预测市场的走向&#xff0c;从而制定相应的交易策略。本文将详细介绍如何分析金价的趋势&#xff0c;并探讨这种分析方…

J1学习打卡

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 # 数据预处理和加载 import torch from torch import nn, optim from torch.utils.data import DataLoader from torchvision import datasets, transforms, …

Python | Leetcode Python题解之第470题用Rand7()实现Rand10()

题目&#xff1a; 题解&#xff1a; class Solution:def rand10(self) -> int:while True:a rand7()b rand7()idx (a - 1) * 7 bif idx < 40:return 1 (idx - 1) % 10a idx - 40b rand7()# get uniform dist from 1 - 63idx (a - 1) * 7 bif idx < 60:retur…

C语言 | Leetcode C语言题解之第472题连接词

题目&#xff1a; 题解&#xff1a; typedef struct Trie {struct Trie * children[26];bool isEnd; }Trie;#define TRIE_INITIAL(node) do { \for (int i 0; i < 26; i) { \(node)->children[i] NULL; \} \(node)->isEnd false; \ }while(0);static void freeTri…

仿IOS桌面悬浮球(支持拖拽、自动吸附、自动改变透明度与点击、兼容PC端与移动端)

使用 pointerdown/pointermove/pointerup 实现仿IOS桌面悬浮球效果&#xff0c;支持拖拽、指定拖拽选对容器&#xff0c;指定拖拽安全区、自动吸附、自动改变透明度与点击&#xff0c;兼容PC端与移动端。 效果展示 https://code.juejin.cn/pen/7423757568268304421 代码实现 …

(27)QPSK信号在非相关平坦莱斯(Rician)衰落信道上的误码率性能MATLAB仿真

文章目录 前言一、Rician衰落信道模型的MATLAB代码二、在非相关的平坦Rician衰落信道上传输QPSK符号模型1.MATLAB仿真代码2.仿真结果 前言 本文首先给出莱斯衰落信道的建模函数&#xff0c;然后基于该函数给出在非相关的平坦Rician衰落信道上传输QPSK数字调制符号的MATLAB仿真…

【OpenCV】基础操作学习--实现原理理解

读取和显示图像 基本操作 cv2.imread(filename , flags)&#xff1a;文件中读取图像&#xff0c;从指定路径中读取图像&#xff0c;返回一个图像数组&#xff08;NumPy数组&#xff09; filename&#xff1a;图像文件的路径flags&#xff1a;指定读取图像的方式 cv2.IMREAD_COL…

IP地址我个人的理解

作为连IP地址都没弄懂的一个网络小白&#xff0c;有时候开发以及建站会接触到IP、DNS等等概念&#xff0c;所以说有必要去查询一下相关知识内容&#xff0c;羞耻地说其实我是有一个计算机网络技术三级证书&#xff0c;但是这个啥用没有死记硬背就行了&#xff0c;许多知识点不能…