python SQLAlchemy 數(shù)據(jù)庫連接池的實(shí)現(xiàn)
SQLALchemy 鏈接數(shù)據(jù)庫使用數(shù)據(jù)庫連接池技術(shù),原理是在系統(tǒng)初始化的時(shí)候,將數(shù)據(jù)庫連接作為對(duì)象存儲(chǔ)在內(nèi)存中,當(dāng)用戶需要訪問數(shù)據(jù)庫時(shí),并非建立一個(gè)新的鏈接,而是從鏈接池中取出一個(gè)已建立的空閑鏈接對(duì)象。使用完畢后,用戶也并非將連接關(guān)閉,而是將連接放回連接池中,以供下一個(gè)請(qǐng)求訪問使用。而鏈接的建立,斷開都由鏈接池來管理,同時(shí),還可以通過設(shè)置鏈接池的參數(shù)來控制鏈接池中的初始鏈接數(shù),鏈接的上下限數(shù)以及每個(gè)鏈接的最大使用次數(shù),最大空閑時(shí)間等。
1. 安裝
安裝SQLAlchemy
pip install SQLAlchemy

安裝mysql
pip install pymysql

2. 創(chuàng)建數(shù)據(jù)庫引擎
示例:
from sqlalchemy import create_engine engine = create_engine(mysql_url, echo=True, pool_size=5, max_overflow=4, pool_recycle=7200, pool_timeout=30)
echo=True: 這表示在執(zhí)行 SQL 查詢時(shí)會(huì)輸出所有 SQL 語句及其參數(shù)到控制臺(tái),方便調(diào)試。
pool_size=5: 這設(shè)置了數(shù)據(jù)庫連接池的大小為 5,表示在連接池中最多可以保持 5 個(gè)連接。
max_overflow=4: 這允許在需要時(shí),連接池外再創(chuàng)建最多 4 個(gè)額外的連接,超出連接池大小的部分會(huì)在使用后關(guān)閉。
pool_recycle=7200: 這表示連接在 7200 秒(2 小時(shí))后會(huì)被回收,避免因長(zhǎng)時(shí)間連接而導(dǎo)致的問題(例如,MySQL 的“互動(dòng)超時(shí)”)。
pool_timeout=30: 這是連接池的超時(shí)時(shí)間,表示如果在 30 秒內(nèi)沒有獲取到可用的連接,將會(huì)拋出異常。
3. 新建表,增刪改查demo
配置文件:

sql.ini:
[datasource] url = TESTDB:TESTDB@127.0.0.1:3306 db = TESTDB?charset=utf8
python demo:
from sqlalchemy import create_engine, Column, String, Integer, DateTime, Index, text
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
import pathlib
import configparser
# 設(shè)置配置文件
current_dir = pathlib.Path(__file__).parent
config_file = current_dir / 'config' / 'sql.ini'
config = configparser.ConfigParser()
with open(config_file, 'r', encoding='utf-8') as f:
config.read_file(f)
url = config['datasource']['url']
db = config['datasource']['db']
mysql_url = f'mysql+pymysql://{url}/{db}'
# 創(chuàng)建數(shù)據(jù)庫引擎
"""
echo=True: 這表示在執(zhí)行 SQL 查詢時(shí)會(huì)輸出所有 SQL 語句及其參數(shù)到控制臺(tái),方便調(diào)試。
pool_size=5: 這設(shè)置了數(shù)據(jù)庫連接池的大小為 5,表示在連接池中最多可以保持 5 個(gè)連接。
max_overflow=4: 這允許在需要時(shí),連接池外再創(chuàng)建最多 4 個(gè)額外的連接,超出連接池大小的部分會(huì)在使用后關(guān)閉。
pool_recycle=7200: 這表示連接在 7200 秒(2 小時(shí))后會(huì)被回收,避免因長(zhǎng)時(shí)間連接而導(dǎo)致的問題(例如,MySQL 的“互動(dòng)超時(shí)”)。
pool_timeout=30: 這是連接池的超時(shí)時(shí)間,表示如果在 30 秒內(nèi)沒有獲取到可用的連接,將會(huì)拋出異常。
"""
engine = create_engine(mysql_url, echo=True, pool_size=5, max_overflow=4, pool_recycle=7200, pool_timeout=30)
Base = declarative_base()
# 設(shè)置會(huì)話
Session = sessionmaker(bind=engine)
session = Session()
# 表結(jié)構(gòu)
class YzyTest(Base):
__tablename__ = 't_yzy_test'
SEQUENCE_NO = Column(Integer, primary_key=True, autoincrement=True, comment='序列號(hào)')
PK_STD_POINT_AI_RELATION = Column(String(36), unique=True, nullable=False, comment='id')
FK_STD_AUDIT_POINT = Column(String(36), nullable=False, comment='審核標(biāo)準(zhǔn)id')
FK_AI_STD = Column(String(36), nullable=False, comment='aiId')
CHANNEL_TAG = Column(String(45), nullable=False, comment='渠道')
FK_USER_CREATE = Column(String(36), nullable=True, comment='創(chuàng)建人id')
USER_NAME_CREATE = Column(String(64), nullable=True, comment='創(chuàng)建人姓名')
CREATE_TIME = Column(DateTime, default=text('CURRENT_TIMESTAMP'), nullable=False, comment='創(chuàng)建時(shí)間')
__table_args__ = (
Index('u_t_yzy_test_01', 'FK_STD_AUDIT_POINT', 'FK_AI_STD', 'CHANNEL_TAG', unique=True),
)
# 創(chuàng)建表
def create_table():
Base.metadata.create_all(engine)
# 查詢數(shù)據(jù)
def query():
return session.query(YzyTest).all()
# 插入數(shù)據(jù)
def save(param):
session.add(param)
session.commit()
# 更新數(shù)據(jù)
def update(param_id, updated_data):
param = session.query(YzyTest).filter(YzyTest.PK_STD_POINT_AI_RELATION == param_id).first()
if param:
for key, value in updated_data.items():
setattr(param, key, value)
session.commit()
# 刪除數(shù)據(jù)
def delete(param_id):
param = session.query(YzyTest).filter(YzyTest.PK_STD_POINT_AI_RELATION == param_id).first()
if param:
session.delete(param)
session.commit()
if __name__ == '__main__':
create_table()
# 示例用法:
new_param = YzyTest(
PK_STD_POINT_AI_RELATION='unique-id-1',
FK_STD_AUDIT_POINT='audit-point-id',
FK_AI_STD='ai-id',
CHANNEL_TAG='channel-tag-example',
USER_NAME_CREATE='創(chuàng)建者姓名'
)
save(new_param)
params = query()
for param in params:
print(param.PK_STD_POINT_AI_RELATION, param.FK_STD_AUDIT_POINT, param.FK_AI_STD, param.CHANNEL_TAG, param.USER_NAME_CREATE)
update('unique-id-1', {'CHANNEL_TAG': 'new_channel_tag'})
params = query()
for param in params:
print(param.PK_STD_POINT_AI_RELATION, param.FK_STD_AUDIT_POINT, param.FK_AI_STD, param.CHANNEL_TAG, param.USER_NAME_CREATE)
delete('unique-id-1')
測(cè)試:


到此這篇關(guān)于python SQLAlchemy 數(shù)據(jù)庫連接池的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)python SQLAlchemy連接池內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 分析解決Python中sqlalchemy數(shù)據(jù)庫連接池QueuePool異常
- 3個(gè)Python?SQLAlchemy數(shù)據(jù)庫操作功能詳解
- Python使用SQLAlchemy模塊實(shí)現(xiàn)操作數(shù)據(jù)庫
- Python?SQLAlchemy與數(shù)據(jù)庫交互操作完整指南
- Python使用sqlalchemy實(shí)現(xiàn)連接數(shù)據(jù)庫的幫助類
- Python中使用sqlalchemy操作數(shù)據(jù)庫的問題總結(jié)
- Python中SQLAlchemy庫的使用方法分析
- Python使用SQLAlchemy進(jìn)行復(fù)雜查詢的操作代碼
- Python如何使用sqlalchemy實(shí)現(xiàn)動(dòng)態(tài)sql
相關(guān)文章
使用Python簡(jiǎn)單實(shí)現(xiàn)去除彩色水印
這篇文章主要為大家詳細(xì)介紹了如何使用Python簡(jiǎn)單實(shí)現(xiàn)去除彩色水印效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-02-02
json 轉(zhuǎn) mot17數(shù)據(jù)格式的實(shí)現(xiàn)代碼 (親測(cè)有效)
這篇文章主要介紹了json 轉(zhuǎn) mot17數(shù)據(jù)格式的實(shí)現(xiàn)代碼 (親測(cè)有效),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
在NumPy中創(chuàng)建空數(shù)組/矩陣的方法
今天小編就為大家分享一篇在NumPy中創(chuàng)建空數(shù)組/矩陣的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-06-06
Python OpenCV視頻截取并保存實(shí)現(xiàn)代碼
這篇文章主要介紹了Python OpenCV視頻截取并保存實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
對(duì)numpy 數(shù)組和矩陣的乘法的進(jìn)一步理解
下面小編就為大家分享一篇對(duì)numpy 數(shù)組和矩陣的乘法的進(jìn)一步理解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-04-04
利用Python爬取微博數(shù)據(jù)生成詞云圖片實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于利用Python爬取微博數(shù)據(jù)生成詞云圖片的相關(guān)資料,文中通過示例代碼介紹非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-08-08
python爬蟲 正則表達(dá)式使用技巧及爬取個(gè)人博客的實(shí)例講解
下面小編就為大家?guī)硪黄猵ython爬蟲 正則表達(dá)式使用技巧及爬取個(gè)人博客的實(shí)例講解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10

