Skip to main content
11、sqlalchemy线程池

11、sqlalchemy线程池

一、连接池特点

  • SQLAlchemy连接数据库所使用的Engine对象默认采用一个连接池来管理连接

    当我们使用Engine对象所对应的SQL数据库连接的资源时,这些对数据库的连接是通过一个连接池(Connection pooling)来管理的。当我们释放(release)一个连接资源时,这个连接并不是被销毁了,而是仍然连接着数据库,只不过其将会被重新存储如一个用于管理连接的连接池(默认为QueuePool)中。放入连接池中的连接可以被复用。事实上总有一定数目的数据库连接被保存在这个连接池中,即使在我们的代码中看起来像是连接被释放了一样。这些连接会在我们的程序结束运行之后自动被销毁,或者当我们显式地调用销毁连接池的代码时被销毁。

  • 连接复用

    由于这个连接池的存在,每当我们在代码中调用Engine.connect()方法或者调用ORM对应的Session的时候,往往会得到一个已存在与连接池中的数据库连接,而不是得到了一个全新的连接对象。然而当连接池中没有现成可用的连接对象的时候,在不超过配置所允许的连接上限的条件下,新的连接对象会被创建并返回给调用这些方法的程序。

  • 默认使用的QueuePool
    SQLAlchemy默认所使用的连接池为sqlalchemy.pool.QueuePool。当目前总连接数没有超过配置的上限且池中没有现成可用的连接的情况下,一个新的连接会被建立并返回给调用创建新连接的方法的程序。这个上限等于create_engine.pool_sizecreate_engine.max_overflow之和。

  • 可上溢的连接池

    如果我们将参数create_engine.max_overflow设置为”-1”,那么连接池会允许“上溢”无限多的新连接。在这种情况下,连接池永远不会阻塞一个新的数据库连接请求。相反,每当有新的连接请求且无当前可用的连接对象,连接池就会无条件地创建新的连接对象来返回给这个请求。

    然而,即使我们在程序端不限制并发的数据库连接的数目,如果程序无限制的创建新的数据库连接对象,连接的数目最终会到达数据库端的连接数目上限,并且耗尽所有数据库允许的连接,最终同样会造成程序异常。


Y-aong...About 6 minpythonsqlalchemy
9、sqlalchemy 一对多关系

9、sqlalchemy 一对多关系

一、模型类

# !/usr/bin/env python
# -*-coding:utf-8 -*-
"""
# File       : teacher_student_model.py
# Time       :2023/7/16 10:42
# Author     :Y-aong
# version    :python 3.7
# Description:sqlalchemy一对多,一对一,多对多关系配置
"""
from public.base_model import db, Base


# 配置一对多关系
class Student(Base):
    __tablename__ = 'test_student'

    name = db.Column(db.String(64), comment='学生名称')
    teacher_id = db.Column(db.Integer, db.ForeignKey('test_teacher.id'))
    # 方式二
    # teacher = db.relationship("Teacher", back_populates="student")


class Teacher(Base):
    __tablename__ = 'test_teacher'
    name = db.Column(db.String(64), comment='教师名称')
    # 方式一、backref,要在一对多中建立双向关系,“反向”端是多对一,
    student = db.relationship('Student', backref='test_teacher')
    # 方式二、back_populates
    # student = db.relationship('Student', back_populates='student')


Y-aong...About 1 minpythonflasksqlalchemy序列化