flask的基本使用

1 sqlalchemy 快速使用

image-20240617211749707

# 1 sqlalchemy 企业级orm框架


# 2 python界的orm框架
	-1 django-orm     #只能django框架用
    -2 peewee          # 小型orm框架:https://docs.peewee-orm.com/en/latest/peewee/quickstart.html
    -----同步orm框架-----
    -3 sqlalchemy     # 企业级,使用非常广泛:https://docs.sqlalchemy.org/en/20/orm/quickstart.html  # 可以用在flask上,还可以用在fastapi
    ---中间态----
    -4 Tortoise ORM  # fastapi用的比较多
    
    
    
# 3 django ,flask---》同步框架--》新版本支持异步
# 4 fastapi,sanic,tornado---》异步框架--》支持同步的写法--》如果在异步框架上写同步
	-众多第三方库---》都是同步的--》导致异步框架性能发挥不出来
    -redis:aioredis  --》redis-py
    -mysql:aiomysql  --》pymysql
    
# 5 异步框架上用同步第三方模块,不能发挥最佳性能?

1.1 快速使用

#  1 安装 pip3 install sqlalchemy   
	- 2.0.30版本
    
    
# 2 架构
    Engine,框架的引擎
    Connection Pooling ,数据库连接池
    Dialect,选择连接数据库的DB API种类 
    SQL Exprression Language,SQL表达式语言
    
# 3 链接不同数据库
## 3.1 postgresql
# default
engine = create_engine("postgresql://scott:tiger@localhost/mydatabase")
# psycopg2
engine = create_engine("postgresql+psycopg2://scott:tiger@localhost/mydatabase")
# pg8000
engine = create_engine("postgresql+pg8000://scott:tiger@localhost/mydatabase")
## 3.2 Mysql
# default
engine = create_engine("mysql://scott:tiger@localhost/foo")
# mysqlclient (a maintained fork of MySQL-Python)
engine = create_engine("mysql+mysqldb://scott:tiger@localhost/foo")
# PyMySQL
engine = create_engine("mysql+pymysql://scott:tiger@localhost/foo")

## 3.3 oracle
engine = create_engine("oracle://scott:tiger@127.0.0.1:1521/sidname")
engine = create_engine("oracle+cx_oracle://scott:tiger@tnsname")

## 3.4 Microsoft SQL Server
# pyodbc
engine = create_engine("mssql+pyodbc://scott:tiger@mydsn")
# pymssql
engine = create_engine("mssql+pymssql://scott:tiger@hostname:port/dbname")

## 3.5 sqlite
# Unix/Mac - 4 initial slashes in total
engine = create_engine("sqlite:absolute/path/to/foo.db")
# Windows
engine = create_engine("sqlite:///C:\\path\\to\\foo.db")
# Windows alternative using raw string
engine = create_engine(r"sqlite:///C:\path\to\foo.db")

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2 sqlalchemy 原生操作

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

#2 原生操作mysql---》用了连接池---》就可以不用dbutils模块了
def task():
    conn = engine.raw_connection()
    cursor = conn.cursor()
    cursor.execute(
        "select * from article"
    )
    result = cursor.fetchall()
    print(result)
    cursor.close()
    conn.close()

for i in range(20):
    t = threading.Thread(target=task)
    t.start()

基本使用

  1. 创建数据库引擎
    • 使用 SQLAlchemy 的 create_engine 函数创建了一个 MySQL 数据库引擎。
    • 连接字符串中包含了数据库的用户名、密码、地址、端口、数据库名以及字符集等信息。
    • 设置了连接池的参数,如最大溢出连接数、连接池大小、等待超时时间以及连接的回收时间。
  2. 定义 task 函数
    • 这个函数使用引擎的 raw_connection 方法来获取一个原始的数据库连接。
    • 使用这个连接创建一个游标对象。
    • 使用游标执行 SQL 查询,并从 info 表中获取所有记录。
    • 打印查询结果。
    • 关闭游标和连接。
  3. 创建并启动线程
    • 使用 Python 的 threading 模块来创建多个线程。
    • 每个线程都执行 task 函数,即并发地从数据库中查询数据。
    • 这里创建了 20 个线程,但连接池的大小只设置为 5,这意味着在某些时刻,可能会有多个线程在等待从连接池中获取可用的连接。
import threading
#  1 创建 engin
from sqlalchemy import create_engine


engine = create_engine(
    "mysql+pymysql://root:123123@127.0.0.1:3306/school?charset=utf8",
    max_overflow=0,  # 超过连接池大小外最多创建的连接
    pool_size=5,  # 连接池大小
    pool_timeout=30,  # 池中没有线程最多等待的时间,否则报错
    pool_recycle=-1  # 多久之后对线程池中的线程进行一次连接的回收(重置)
)

#2 原生操作mysql---》用了连接池---》就可以不用dbutils模块了
def task():
    conn = engine.raw_connection()
    cursor = conn.cursor()
    cursor.execute(
        "select * from info"
    )
    result = cursor.fetchall()
    print(result)
    cursor.close()
    conn.close()

for i in range(20):
    t = threading.Thread(target=task)
    t.start()

image-20240618155625776

3 sqlalchemy操作表

3.1 创建删除表

  • datetime.datetime.now不能加括号,加了括号,以后永远是当前时间

from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, UniqueConstraint, Index
import datetime
###### 第一步:创建基类,以后所有类,都必须继承基类

#### 1 老版本创建基类(不建议)
# from sqlalchemy.ext.declarative import declarative_base
# Base = declarative_base()

#### 2 新版本创建基类
from sqlalchemy.orm import DeclarativeBase
class Base(DeclarativeBase):
    pass


### 第二步:写个类,继承
### 第三步:写字段:传统方式,类型方式
class User(Base):
    __tablename__='user'
    id=Column(Integer,primary_key=True,autoincrement=True)
    name = Column(String(32), index=True, nullable=False)  # name列varchar32,索引,不可为空
    email = Column(String(32), unique=True)  # email 列,varchar32,唯一
    # datetime.datetime.now不能加括号,加了括号,以后永远是当前时间
    ctime = Column(DateTime, default=datetime.datetime.now)
    extra = Column(Text, nullable=True)


if __name__ == '__main__':
    from sqlalchemy import create_engine

    engine = create_engine(
        "mysql+pymysql://root:1234@127.0.0.1:3306/sqlalchemy001?charset=utf8",
        max_overflow=0,  # 超过连接池大小外最多创建的连接
        pool_size=5,  # 连接池大小
        pool_timeout=30,  # 池中没有线程最多等待的时间,否则报错
        pool_recycle=-1  # 多久之后对线程池中的线程进行一次连接的回收(重置)
    )
    ## 第四步:创建表(不能创建库,只能新增或删除表,不能增加删除字段)
    # Base.metadata.create_all(engine)

    ## 第五步:删除表
    Base.metadata.drop_all(engine)
from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, UniqueConstraint, Index
import datetime

# 新版本创建基类
# 第一步:创建基类,以后所有类,都必须继承基类
from sqlalchemy.orm import DeclarativeBase


class Base(DeclarativeBase):
    pass


### 第二步:写个类,继承
### 第三步:写字段:传统方式,类型方式

class User(Base):
    __tablename__ = 'user'

    id = Column(Integer, primary_key=True, autoincrement=True)
    # name列varchar32,索引,不可为空 nullable=False
    name = Column(String(32), index=True, nullable=False)
    # email 列,varchar32,唯一
    email = Column(String(32), unique=True)
    ctime = Column(DateTime, default=datetime.datetime.now)
    extra = Column(Text, nullable=True)


if __name__ == '__main__':
    from sqlalchemy import create_engine

    engine = create_engine(
        "mysql+pymysql://root:123123@127.0.0.1:3306/school?charset=utf8",
        max_overflow=0,  # 超过连接池大小外最多创建的连接
        pool_size=5,  # 连接池大小
        pool_timeout=30,  # 池中没有线程最多等待的时间,否则报错
        pool_recycle=-1  # 多久之后对线程池中的线程进行一次连接的回收(重置)
    )
    # 第四步 创建user表
    Base.metadata.create_all(engine)

    ## 第五步:删除表
    # Base.metadata.drop_all(engine)

image-20240618161400415

image-20240618161346333

1.2 增删查改

from models import User
# 第一步:创建engine
from sqlalchemy import create_engine
engine = create_engine(
    "mysql+pymysql://root:1234@127.0.0.1:3306/sqlalchemy001?charset=utf8",
    max_overflow=0,  # 超过连接池大小外最多创建的连接
    pool_size=5,  # 连接池大小
    pool_timeout=30,  # 池中没有线程最多等待的时间,否则报错
    pool_recycle=-1  # 多久之后对线程池中的线程进行一次连接的回收(重置)
)

# 第二步:创建 session对象---老方式
# from sqlalchemy.orm import sessionmaker
# Session = sessionmaker(bind=engine)
# session=Session()
# 第二步:创建 session对象---新方式(推荐)
from sqlalchemy.orm import Session
session=Session(engine)

# 第三步:使用session对象
# 1 新增
user1=User(name='lqz11',email='333@qq.com')
user2=User(name='lqz12',email='335@qq.com')
# session.add(user)
session.add_all([user1,user2])
session.commit()  #提交
session.close()


# 2 搜索--》简单
# res=session.query(User).filter_by(name='lqz').all()
# res=session.query(User).filter_by(id=1).all()
# print(res)
# print(res[0])

# 3 删除
# res=session.query(User).filter_by(name='lqz').delete()
# print(res)
# session.commit()

# 4 修改
# res=session.query(User).filter_by(id=2).update({'name':'ooo'})
# session.commit()
# user=session.query(User).filter_by(id=2).first()
# print(user.id)
# user.name='uuii'
# session.add(user) #[id字段在不在] 如果对象不存在,就是新增,如果对象存在,就是修改
# session.commit()





1.2.1增加

from models import User

from sqlalchemy import create_engine

engine = create_engine(
    "mysql+pymysql://root:123123@127.0.0.1:3306/school?charset=utf8",
    max_overflow=0,  # 超过连接池大小外最多创建的连接
    pool_size=5,  # 连接池大小
    pool_timeout=30,  # 池中没有线程最多等待的时间,否则报错
    pool_recycle=-1  # 多久之后对线程池中的线程进行一次连接的回收(重置)
)

from sqlalchemy.orm import Session

session = Session(engine)

res1 = User(name='maojingyi', email='666@qq.com')
res2 = User(name='jingyi', email='969@qq.com')

session.add_all([res1,res2])
session.commit()  #提交
session.close()

image-20240618163757166

1.2.2搜索

# 搜索
res = session.query(User).filter_by(name='maojingyi').all()
print(res)
  • 我们可以定制返回的形式
  • 这个是在models.py的User表中写入
    def __repr__(self):
        return f"<User(name={self.name}, email={self.email})>"

image-20240618164832140

image-20240618165019701

1.2.3删除

  • 删除所有name='maojingyi'
res=session.query(User).filter_by(name='maojingyi').delete()
print(res)
session.commit()
result = session.query(User).filter(User.id == 1, User.email == '666@qq.com').delete()  
# 

1.2.4修改

# session.add(user) #[id字段在不在] 如果对象不存在,就是新增,如果对象存在,就是修改
# session.commit()
# 修改
res = session.query(User).filter_by(id=2).update({'name': 'ooo'})
session.commit()
session.close()
user=session.query(User).filter_by(id=2).first()
print(user.name)

image-20240618165740499

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

虚拟机交叉编译基于ARM平台的opencv(ffmpeg/x264)

背景&#xff1a; 由于手上有一块rk3568的开发板&#xff0c;需要运行yolov5跑深度学习模型&#xff0c;但是原有的opencv不能对x264格式的视频进行解码&#xff0c;这里就需要将ffmpegx264编译进opencv。 但是开发板算力有限&#xff0c;所以这里采用在windows下&#xff0c;安…

React Native V0.74 — 稳定版已发布

嗨,React Native开发者们, React Native 世界中令人兴奋的消息是,V0.74刚刚在几天前发布,有超过 1600 次提交。亮点如下: Yoga 3.0New Architecture: Bridgeless by DefaultNew Architecture: Batched onLayout UpdatesYarn 3 for New Projects让我们深入了解每一个新亮点…

k8s 中间件

1. zookeeper 是的&#xff0c;Zookeeper 和 Kafka 经常一起使用&#xff0c;Zookeeper 在 Kafka 中扮演了关键角色。以下是 Zookeeper 和 Kafka 在实际项目中的结合使用及其作用的详细说明。 项目背景 假设我们有一个分布式数据处理系统&#xff0c;该系统需要高吞吐量的实…

300关卡成语释义典故题库ACCESS\EXCEL数据库

成语典故指关于成语产生、形成、流传的故事传说。成语有很大一部分是从古代相承沿用下来的&#xff0c;它既代表了一个故事典故&#xff0c;又是一种现成的话&#xff0c;很多又有比喻引申意义而被广泛引用。 今天又获得了一个成语游戏的数据&#xff0c;即根据成语典故或者释…

vue+element-ui简洁完美实现个人博客“​响石潭 ​”

目录 一、项目介绍 二、项目截图 1.项目结构图 2.首页 3.生活 ​编辑 4.文章详情 ​编辑 5.关于我 ​编辑 ​编辑 三、源码实现 1.项目依赖package.json 2.项目启动 3.首页源码 四、总结 一、项目介绍 本项目在线预览&#xff1a;点击访问 参考官网&#xff1…

基于SpringBoot前后端分离旅游出行管理系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f;感兴趣的可以先收藏起来&#xff0c;还…

vue3长列表优化,使用vue-virtual-scroller实现直播间弹幕列表虚拟滚动效果

使用的组件库是&#xff1a;https://github.com/Akryum/vue-virtual-scroller 官方文档&#xff1a;vue-virtual-scroller 安装依赖 npm install --save vue-virtual-scrollernextpnpm install --save vue-virtual-scrollernextyarn add vue-virtual-scrollernext 组件导入…

实战whisper第三天:fast whisper 语音识别服务器部署,可远程访问,可商业化部署(全部代码和详细部署步骤)

Fast Whisper 是对 OpenAI 的 Whisper 模型的一个优化版本,它旨在提高音频转录和语音识别任务的速度和效率。Whisper 是一种强大的多语言和多任务语音模型,可以用于语音识别、语音翻译和语音分类等任务。 Fast Whisper 的原理 Fast Whisper 是在原始 Whisper 模型的基础上进…

如何在《课外语文》期刊上发表论文?

如何在《课外语文》期刊上发表论文&#xff1f; 《课外语文》知网 G刊 月刊 3版3300字符 25年2-3月 &#xff08;栏目设置&#xff1a;学生作文&#xff1b;思辨阅读&#xff1b;课外读物&#xff1b;美文欣赏&#xff1b;整本书阅读&#xff1b;名师指路&#xff0c;趣味汉…

【经典算法题】两数之和

暴力解法 两层for循环&#xff0c;O(n*n) 优化解法 哈希&#xff0c;O(n) class Solution {public int[] twoSum(int[] nums, int target) {Map<Integer, Integer> hashtable new HashMap<Integer, Integer>();for (int i 0; i < nums.length; i) {if (ha…

工程安全监测仪器:振弦采集仪的应用与发展

工程安全监测仪器&#xff1a;振弦采集仪的应用与发展 振弦采集仪是一种常见的工程安全监测仪器&#xff0c;广泛应用于建筑、桥梁、隧道、地铁等工程项目中。它通过监测振弦的振动变化&#xff0c;可以及时发现结构变形或损坏情况&#xff0c;为工程的安全运行提供重要数据支…

0 TMS320F28379D 开坑

开坑原因 最近开始做实验&#xff0c;实验室的主控采用的是F2812FPGA&#xff0c;属于够用但不好用的状态。FPGA用于生成调制信号&#xff0c;DSP完成采样和控制。师兄师姐研究拓扑及调制策略&#xff0c;对驱动数量以及驱动逻辑有比较高的要求&#xff0c;因此不好脱离FPGA&a…

如何避免Java资源的过度配置

作为开发人员&#xff0c;我们经常会陷入两难的局面&#xff1a;我们既希望在应用中使用闪亮的新工具或代码库&#xff0c;又忌惮在部署到生产环境之后可能出现的未知问题。毕竟&#xff0c;没有人希望自己的手机老是在半夜叮咚作响&#xff0c;更不用说来自为了保持应用能够以…

增加Github访问稳定性

使用 steamcommunity_302软件 官方下载和使用地址&#xff1a; https://www.dogfight360.com/blog/686/#google_vignette

2.2.4 C#中显示控件BDPictureBox 的实现----ROI交互

2.2.4 C#中显示控件BDPictureBox 的实现----ROI交互 1 界面效果 在设定模式下&#xff0c;可以进行ROI 框的拖动&#xff0c;这里以Rect1举例说明 2 增加ROI类定义 /// <summary> /// ROI_single /// 用于描述图片感兴趣区域 /// type: 0:Rect1;1:Rect2;2:Circle ;3:…

SQL Server数据库的组成

《SQL Server 2022从入门到精通&#xff08;视频教学超值版&#xff09;》图书介绍-CSDN博客 对于数据库的概念&#xff0c;没有一个完全固定的定义&#xff0c;随着数据库历史的发展&#xff0c;定义的内容也有很大的差异&#xff0c;其中一种比较普遍的观点认为&#xff0c;…

Java - 程序员面试笔记记录 实现 - Part1

社招又来学习 Java 啦&#xff0c;这次选了何昊老师的程序员面试笔记作为主要资料&#xff0c;记录一下一些学习过程。 1.1 Java 程序初始化 Java 程序初始化遵循规则&#xff1a;静态变量优于动态变量&#xff1b;父类优于子类&#xff1b;成员变量的定义顺序&#xff1b; …

使用TensorFlow进行OCR识别:将表格图片转换为结构化数据

随着人工智能和机器学习技术的不断发展&#xff0c;OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;技术已经成为处理图像中文本信息的强大工具。TensorFlow是一个广泛使用的开源机器学习框架&#xff0c;它提供了丰富的API和工具&#xff…

【源码 +文档+调试讲解】大学生企业推荐系统ssm

大学生企业推荐系统采用B/S结构、java开发语言、以及Mysql数据库等技术。系统主要分为管理员和学生、企业三部分&#xff0c;管理员主要功能包括&#xff1a;首页、个人中心、学生管理、企业管理、招聘信息管理、个人简历管理、应聘职位管理、评价企业管理、交流论坛、系统管理…

IDEA中Maven的配置

目录 1. 安装maven 2. 配置环境变量 3. IDEA中配置Maven 4. 配置仓库目录 1. 安装maven 官网下载地址&#xff1a;Maven – Download Apache Maven 下载后&#xff0c;将zip压缩包解压到某个目录即可。 2. 配置环境变量 变量名称随意&#xff0c;通常为M2_HOME&#xff…