Python:SQLalchemy 使用

1. sqlalchemy 中 create_engine 中的参数

  • pool_size
    -- 设置连接池中,保持的连接数;
    -- 初始化时并不产生连接,只有慢慢需要连接时,才会产生连接;
    -- 例如我们的连接数设置成 pool_size=10,如果我们的并发量一直最高是 5,那么我们的连接池里的连接数也就是5,当我们有一次并发量达到了 10,以后并发量虽然下去了,连接池中也会保持 10 个连接。

  • max_overflow
    -- 当连接池里的连接数已达到 pool_size 且都被使用时,max_overflow就是允许再新建的连接数;
    -- 例如pool_size=10,max_overlfow=5,当我们的并发量达到 12 时,当第 11 个并发到来后,就会去再建一个连接,第 12 个同样,当第11个连接处理完回收后,若没有在等待进程获取连接,这个连接将会被立即释放。

  • pool_timeout
    -- 从连接池里获取连接,如果此时无空闲的连接,且连接数已经到达了 pool_size+max_overflow,此时获取连接的进程会等待pool_timeout秒,如果超过这个时间,还没有获得将会抛出异常;
    -- sqlalchemy 默认 30 秒;

  • pool_recycle
    -- pool_recycle 指一个数据库连接的生存时间;
    -- 例如 pool_recycle=3600,也就是当这个连接产生 1 小时后,再获得这个连接时,会丢弃这个连接,重新创建一个新的连接;
    -- 当 pool_recycle 设置为 -1 时,也就是连接池不会主动丢弃这个连接、永久可用,但是有可能数据库 server 设置了连接超时时间,例如 mysql 设置的有 wait_timeout 默认为 28800、即 8 小时,当连接空闲 8 小时时会自动断开,8 小时后再用这个连接也会被重置。

2. 连接实例

  • sqlalchemy + mysql 应用示例:
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session
from models import Student,Course,Student2Course
from threading import Thread


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


def task():
    """"""
    # 方式一:
    """
    # 查询
    # cursor = session.execute('select * from users')
    # result = cursor.fetchall()

    # 添加
    cursor = session.execute('INSERT INTO users(name) VALUES(:value)', params={"value": 'wupeiqi'})
    session.commit()
    print(cursor.lastrowid)
    """
    # 方式二:
    """
    # conn = engine.raw_connection()
    # cursor = conn.cursor()
    # cursor.execute(
    #     "select * from t1"
    # )
    # result = cursor.fetchall()
    # cursor.close()
    # conn.close()
    """

    # 将连接交还给连接池
    session.remove()


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

你可能感兴趣的:(Python:SQLalchemy 使用)