Python: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:123456@127.0.0.1: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() ```