ORM框架SQLAlchemy

ORM框架SQLAlchemy

目录

  • ORM框架SQLAlchemy
    • 介绍
    • 安装
    • 架构
    • 连接数据库
      • 1. PostgreSQL
      • 2. MySQL
      • 3. Oracle
      • 4. Microsoft SQL Server
      • 5. SQLite
    • 创建连接池
    • 原生Python操作数据库
    • SQLAlchemy的ORM操作
      • 创建表
      • 外键字段的创建
        • 一对多
        • 多对多
      • ORM操作增删改查
        • 查询
        • 添加
        • 删除
        • 修改

介绍

sqlalchemy是Python的SQL工具和ORM框架,可以用Python代码直接操作关系型数据库(例如:MySQL、PostgreSQL、Oracle)

官方文档

安装

pip install sqlalchemy

架构

  • Engine:框架的引擎
  • Connection Pooling :数据库连接池
  • Dialect:选择连接数据库的DB API种类
  • SQL Exprression Language:SQL表达式语言

连接数据库

from sqlalchemy import create_engine  

1. PostgreSQL

# 使用默认驱动  
postgres_default_engine = create_engine("postgresql://scott:tiger@localhost/mydatabase")  
# 使用 psycopg2 驱动  
postgres_psycopg2_engine = create_engine("postgresql+psycopg2://scott:tiger@localhost/mydatabase")  
# 使用 pg8000 驱动  
postgres_pg8000_engine = create_engine("postgresql+pg8000://scott:tiger@localhost/mydatabase")  

2. MySQL

# 使用默认驱动  
mysql_default_engine = create_engine("mysql://scott:tiger@localhost/foo")  
# 使用 mysqlclient(MySQL-Python 的维护分支)  
mysql_mysqlclient_engine = create_engine("mysql+mysqldb://scott:tiger@localhost/foo")  
# 使用 PyMySQL  
mysql_pymysql_engine = create_engine("mysql+pymysql://scott:tiger@localhost/foo")  

3. Oracle

# 使用默认驱动(不推荐,建议使用 cx_oracle)  
oracle_default_engine = create_engine("oracle://scott:tiger@127.0.0.1:1521/sidname")  
# 使用 cx_oracle 驱动  
oracle_cx_oracle_engine = create_engine("oracle+cx_oracle://scott:tiger@tnsname")  

4. Microsoft SQL Server

# 使用 pyodbc 驱动  
mssql_pyodbc_engine = create_engine("mssql+pyodbc://scott:tiger@mydsn")  
# 使用 pymssql 驱动  
mssql_pymssql_engine = create_engine("mssql+pymssql://scott:tiger@hostname:port/dbname")  

5. SQLite

# Unix/Mac - 使用绝对路径  
sqlite_unix_engine = create_engine("sqlite:absolute/path/to/foo.db")  
# Windows - 使用绝对路径  
sqlite_windows_engine = create_engine("sqlite:///C:\\path\\to\\foo.db")  
# Windows - 使用原始字符串和绝对路径  
sqlite_windows_raw_engine = create_engine(r"sqlite:///C:\path\to\foo.db")

创建连接池

这里使用pymysql进行连接

from sqlalchemy import create_engine# 连接到localhost的flaskdemo库中,用户root密码1234
engine = create_engine("mysql+pymysql://root:1234@localhost/flaskdemo",	max_overflow=0,  # 超过连接池大小外最多创建的连接pool_size=5,  # 连接池大小pool_timeout=30,  # 池中没有线程最多等待的时间,否则报错pool_recycle=-1  # 多久之后对线程池中的线程进行一次连接的回收(重置))

原生Python操作数据库

from sqlalchemy import create_engineengine = create_engine("mysql+pymysql://root:1234@localhost/flaskdemo",	max_overflow=0, pool_size=5, pool_timeout=30,pool_recycle=-1)def task(engine):conn = engine.raw_connection()cursor = conn.cursor()cursor.execute(# 查询users表中所有数据"select * from users")result = cursor.fetchall()print(result)cursor.close()conn.close()task(engine)

SQLAlchemy的ORM操作

创建表

import datetimefrom sqlalchemy import create_engine, Column, Integer, String, DateTime
from sqlalchemy.orm import DeclarativeBaseclass Base(DeclarativeBase):passclass User(Base):__tablename__ = 'user'	# 表名id = Column(Integer, primary_key=True, autoincrement=True)	# 自增主键字段idname = Column(String(32), nullable=False, index=True)	# 最大长度32不可为空 普通索引类型的字段nameage = Column(Integer)create_time = Column(DateTime, default=datetime.datetime.now)if __name__ == '__main__':engine = create_engine("mysql+pymysql://root:7997@localhost/flaskdemo",max_overflow=0,  # 超过连接池大小外最多创建的连接pool_size=5,  # 连接池大小pool_timeout=30,  # 池中没有线程最多等待的时间,否则报错pool_recycle=-1  # 多久之后对线程池中的线程进行一次连接的回收(重置))Base.metadata.create_all(engine)	# 创建Base下的所有表# Base.metadata.drop_all(engine)	# 删除表

外键字段的创建

一对多

创建用户表和兴趣表,用户表的hobby_id和兴趣表是一对多关系

import datetimefrom sqlalchemy import create_engine, Column, Integer, String, DateTime, ForeignKey
from sqlalchemy.orm import DeclarativeBase, relationshipclass Base(DeclarativeBase):passclass User(Base):__tablename__ = 'user'id = Column(Integer, primary_key=True, autoincrement=True)name = Column(String(32), nullable=False, index=True)# 这里的hobby是表名而不是类名hobby_id = Column(Integer, ForeignKey('hobby.id'))# 用于正向查询:user.hobby,绑定级联删除hobby = relationship('Hobby', back_populates='user', cascade='all,delete')class Hobby(Base):__tablename__ = 'hobby'id = Column(Integer, primary_key=True, autoincrement=True)name = Column(String(32), nullable=False, index=True)# 用于反向查询:hobby.userusers = relationship('User', back_populates='hobby', foreign_keys=[User.hobby_id])if __name__ == '__main__':engine = create_engine("mysql+pymysql://root:7997@localhost/flaskdemo",max_overflow=0,  # 超过连接池大小外最多创建的连接pool_size=5,  # 连接池大小pool_timeout=30,  # 池中没有线程最多等待的时间,否则报错pool_recycle=-1  # 多久之后对线程池中的线程进行一次连接的回收(重置))Base.metadata.create_all(engine)
多对多
import datetimefrom sqlalchemy import create_engine, Column, Integer, String, ForeignKey, Table
from sqlalchemy.orm import DeclarativeBase, relationship, Sessionclass Base(DeclarativeBase):passuser_course = Table('user_course', Base.metadata,Column('user_id', Integer, ForeignKey('user.id')),Column('course_id', Integer, ForeignKey('course.id')))class User(Base):__tablename__ = 'user'id = Column(Integer, primary_key=True, autoincrement=True)name = Column(String(32), nullable=False, index=True)# 这里的hobby是表名而不是类名hobby_id = Column(Integer, ForeignKey('hobby.id'))# 正向查询,关联一对多hobby,多对多coursehobby = relationship('Hobby', back_populates='user', cascade='all,delete')course = relationship('Course', back_populates='user', secondary=user_course)class Hobby(Base):__tablename__ = 'hobby'id = Column(Integer, primary_key=True, autoincrement=True)name = Column(String(32), nullable=False, index=True)# 用于反向查询:hobby.useruser = relationship('User', back_populates='hobby', foreign_keys=[User.hobby_id])class Course(Base):__tablename__ = 'course'id = Column(Integer, primary_key=True, autoincrement=True)name = Column(String(32), nullable=False, index=True)# 用于反向查询:course.useruser = relationship('User', back_populates='course', secondary=user_course)if __name__ == '__main__':engine = create_engine("mysql+pymysql://root:7997@localhost/flaskdemo",max_overflow=0,  # 超过连接池大小外最多创建的连接pool_size=5,  # 连接池大小pool_timeout=30,  # 池中没有线程最多等待的时间,否则报错pool_recycle=-1  # 多久之后对线程池中的线程进行一次连接的回收(重置))Base.metadata.create_all(engine)  # 创建表

ORM操作增删改查

假设目前这三张表中有这些数据

image-20240617215745445

查询
def find():session = Session(engine)res = session.query(User).filter_by(name='陈五').first()print(res.name)# 获取res多对多关联的所有course字段for i in res.course:print(i.name)res_all = session.query(User).all()for i in res_all:print(i.name)
添加
def add():session = Session(engine)user = User(name='陈五', hobby_id=2)# 多对多字段 单个数据添加user.course.append(Course(name='语文'))user.course.append(Course(name='数学'))# 多对多字段 多个数据添加courses = session.query(Course).where(Course.id > 1).all()	# 获取所有id>1的course对象user1 = session.query(User).filter_by(name='彭于晏').first() # 获取彭于晏对象user1.course = coursessession.add(user)session.commit()
删除
def delete():session = Session(engine)# 无外键字段删除session.query(User).filter_by(name='张三').delete()	# 需要关联关系上绑定级联删除# 多对多删除user = session.query(User).filter_by(name='彭于晏').first()course = session.query(Course).filter_by(name='英语').first()# 删除彭于晏和英语的外键绑定session.query(user_course).filter_by(user_id=user.id, course_id=course.id).delete()	session.commit()session.commit()
修改
def change():session = Session(engine)# 无外键字段修改session.query(User).filter_by(id=2).update({'name': '彭于晏'})session.commit()

session.query(user_course).filter_by(user_id=user.id, course_id=course.id).delete()
session.commit()

session.commit()

#### 修改```python
def change():session = Session(engine)# 无外键字段修改session.query(User).filter_by(id=2).update({'name': '彭于晏'})session.commit()

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

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

相关文章

帝国CMS二次开发H5手游如何让同一个url 不同的模板

帝国CMS在二次开发《72游戏网》的时候,H5手游如何让同一个url 不同的模板 比如:www.72yy.com/you/11935.html 是H5游戏宣传页 由于很多H5游戏和网页游戏都是需要使用iframe来嵌套使用的 利于自己网站SEO收录优化 那么就再复制一套程序 用二级目录或者二…

一种基于非线性滤波过程的旋转机械故障诊断方法(MATLAB)

在众多的旋转机械故障诊断方法中,包络分析,又称为共振解调技术,是目前应用最为成功的方法之一。首先,对激励引起的共振频带进行带通滤波,然后对滤波信号进行包络谱分析,通过识别包络谱中的故障相关的特征频…

【Linux基础IO】重定向以及原理分析

我们先来看下面一个情况&#xff1a; #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #define filename "text.txt"int main(){close(1);//关…

[Linux] 系统管理

全局配置文件 用户个性化配置 配置文件的种类 alias命令和unalias命令 进程管理 进程表

使用Docker在Mac上部署OnlyOffice,预览编辑word、excel、ppt非常好

前端编辑word、ppt文档&#xff0c;开源免费方案并没有找到合适的&#xff0c;像wps、石墨文档都是自研的方案。实现过程中wps采用的svg方案&#xff0c;而石墨文档采用的是canvas&#xff0c;它们均是自己来实现编辑器&#xff0c;不依赖浏览器提供的编辑器&#xff08;conten…

嵌入式Linux:Linux系统中文件类型

目录 1、普通文件 2、目录文件 3、字符设备文件 4、块设备文件 5、符号链接文件 6、套接字文件 7、管道文件 8、stat命令和ls命令 8.1、stat命令 8.2、ls命令 9、stat、fstat、lstat函数 9.1、stat函数 9.2、fstat函数 9.3、lstat函数 在Windows系统中&#xff0…

【Python】已完美解决:(Python键盘中断报错问题) KeyboardInterrupt

文章目录 一、问题背景二、可能出错的原因三、错误代码示例四、正确代码示例&#xff08;结合实战场景&#xff09;五、注意事项 已解决&#xff1a;Python中处理KeyboardInterrupt&#xff08;键盘中断&#xff09;报错问题 一、问题背景 在Python编程中&#xff0c;当我们运…

Java | Leetcode Java题解之第167题两数之和II-输入有序数组

题目&#xff1a; 题解&#xff1a; class Solution {public int[] twoSum(int[] numbers, int target) {int low 0, high numbers.length - 1;while (low < high) {int sum numbers[low] numbers[high];if (sum target) {return new int[]{low 1, high 1};} else i…

人工智能指数报告

2024人工智能指数报告&#xff08;一&#xff09;&#xff1a;研发 前言 全面分析人工智能的发展现状。 从2017年开始&#xff0c;斯坦福大学人工智能研究所&#xff08;HAI&#xff09;每年都会发布一份人工智能的研究报告&#xff0c;人工智能指数报告&#xff08;AII&…

数据结构:快速排序,归并排序,计数排序的实现分析

✨✨小新课堂开课了&#xff0c;欢迎欢迎~✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 小新的主页&#xff1a;编程版小新-CSDN博客 1.快排 1.1算法思想 选择一个基准元素&#xff0c;…

服务器SSH 免密码登录

1. 背景 为了服务器的安全着想&#xff0c;设置的服务器密钥非常长。但是这导致每次连接服务器都需要输入一长串的密码&#xff0c;把人折腾的很痛苦&#xff0c;所以我就在想&#xff0c;能不能在终端SSH的时候无需输入密码。 windows 可以使用 xshell 软件&#xff0c;会自…

安装react之nvm版本低引起的问题

1.背景 准备搭建一个react&#xff0c;然后看官网文档 创建项目&#xff0c;使用命令行 npx create-next-applatest 创建项目的流程都是正常的。当我准备运行项目的时候&#xff0c;报错了 原先的报错没有了&#xff0c;从网上找了一个类似的 重要的内容是&#xff1a;当前…

锂电池寿命预测 | Matlab基于ARIMA的锂电池寿命预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 锂电池寿命预测 | Matlab基于ARIMA的锂电池寿命预测 NASA数据集&#xff0c;B0005号电池&#xff0c;选择前110个数据训练&#xff0c;后58个数据测试预测。程序包含去趋势线、差分、平稳化及AIC准则判定p和q。命令窗…

【调试笔记-20240619-Windows-Typescripts中类型不匹配的解决方法】

调试笔记-系列文章目录 调试笔记-20240619-Windows-Typescripts中类型不匹配的解决方法 文章目录 调试笔记-系列文章目录调试笔记-20240619-Windows-Typescripts中类型不匹配的解决方法 前言一、调试环境操作系统&#xff1a;Windows 10 专业版调试环境调试目标 二、调试步骤搜…

webstorm yarn环境配置

1. 安装nodejs https://nodejs.cn/download/ 2. 安装npm npm i yarn -g3.下载并安装webstorm https://www.jetbrains.com/webstorm/ 4. 打开settings确认node和yarn的配置正确5. 打开项目更新包 yarn install

数据分析第十一讲:pandas应用入门(六)

pandas应用入门&#xff08;六&#xff09; 我们再来看看Index类型&#xff0c;它为Series和DataFrame对象提供了索引服务&#xff0c;有了索引我们就可以排序数据&#xff08;sort_index方法&#xff09;、对齐数据&#xff08;在运算和合并数据时非常重要&#xff09;并实现…

技术与创意并驾齐驱:打造扭蛋机小程序的独特魅力

引言 扭蛋机小程序以其独特的玩法和吸引力&#xff0c;在移动互联网市场中崭露头角。本文将深入探讨如何通过技术与创意的并驾齐驱&#xff0c;打造扭蛋机小程序的独特魅力。 一、技术驱动&#xff1a;打造稳定高效的小程序平台 在扭蛋机小程序的开发过程中&#xff0c;技术是…

Java swing JTable 示例

代码&#xff0c; import java.awt.Container; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable;public class Mylmlk {public static void main(String[] agrs){JFrame framenew JFrame("学生成绩表");frame.setSize(500,2…

Hadoop升级失败,File system image contains an old layout version -64

原始版本 Hadoop 3.1.3 升级版本 Hadoop 3.3.3 报错内容如下 datasophon 部署Hadoop版本 查看Hadoop格式化版本 which hadoop-daemon.sh/bigdata/app/hadoop-3.1.3/sbin/hadoop-daemon.sh删除原来的旧版本 rm -rf /bigdata/app/hadoop-3.1.3查看环境变量 env|grep HADOOPHAD…

【归档】maven的使用

学习自波波酱老师SSM企业级框架最全教学视频 maven篇 maven的设置 <?xml version"1.0" encoding"UTF-8"?> <settings xmlns"http://maven.apache.org/SETTINGS/1.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&qu…