python SQLAlchemy 數(shù)據(jù)庫連接池的實現(xiàn)
SQLALchemy 鏈接數(shù)據(jù)庫使用數(shù)據(jù)庫連接池技術(shù),原理是在系統(tǒng)初始化的時候,將數(shù)據(jù)庫連接作為對象存儲在內(nèi)存中,當用戶需要訪問數(shù)據(jù)庫時,并非建立一個新的鏈接,而是從鏈接池中取出一個已建立的空閑鏈接對象。使用完畢后,用戶也并非將連接關(guān)閉,而是將連接放回連接池中,以供下一個請求訪問使用。而鏈接的建立,斷開都由鏈接池來管理,同時,還可以通過設(shè)置鏈接池的參數(shù)來控制鏈接池中的初始鏈接數(shù),鏈接的上下限數(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 查詢時會輸出所有 SQL 語句及其參數(shù)到控制臺,方便調(diào)試。
pool_size=5: 這設(shè)置了數(shù)據(jù)庫連接池的大小為 5,表示在連接池中最多可以保持 5 個連接。
max_overflow=4: 這允許在需要時,連接池外再創(chuàng)建最多 4 個額外的連接,超出連接池大小的部分會在使用后關(guān)閉。
pool_recycle=7200: 這表示連接在 7200 秒(2 小時)后會被回收,避免因長時間連接而導(dǎo)致的問題(例如,MySQL 的“互動超時”)。
pool_timeout=30: 這是連接池的超時時間,表示如果在 30 秒內(nèi)沒有獲取到可用的連接,將會拋出異常。
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 查詢時會輸出所有 SQL 語句及其參數(shù)到控制臺,方便調(diào)試。
pool_size=5: 這設(shè)置了數(shù)據(jù)庫連接池的大小為 5,表示在連接池中最多可以保持 5 個連接。
max_overflow=4: 這允許在需要時,連接池外再創(chuàng)建最多 4 個額外的連接,超出連接池大小的部分會在使用后關(guān)閉。
pool_recycle=7200: 這表示連接在 7200 秒(2 小時)后會被回收,避免因長時間連接而導(dǎo)致的問題(例如,MySQL 的“互動超時”)。
pool_timeout=30: 這是連接池的超時時間,表示如果在 30 秒內(nèi)沒有獲取到可用的連接,將會拋出異常。
"""
engine = create_engine(mysql_url, echo=True, pool_size=5, max_overflow=4, pool_recycle=7200, pool_timeout=30)
Base = declarative_base()
# 設(shè)置會話
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='序列號')
PK_STD_POINT_AI_RELATION = Column(String(36), unique=True, nullable=False, comment='id')
FK_STD_AUDIT_POINT = Column(String(36), nullable=False, comment='審核標準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)建時間')
__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')
測試:


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

