python SQLAlchemy 數(shù)據(jù)庫連接池的實現(xiàn)
SQLALchemy 鏈接數(shù)據(jù)庫使用數(shù)據(jù)庫連接池技術(shù),原理是在系統(tǒng)初始化的時候,將數(shù)據(jù)庫連接作為對象存儲在內(nèi)存中,當(dāng)用戶需要訪問數(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='審核標(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)建時間') __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進(jìn)行復(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)代碼 (親測有效),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03在NumPy中創(chuàng)建空數(shù)組/矩陣的方法
今天小編就為大家分享一篇在NumPy中創(chuàng)建空數(shù)組/矩陣的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06Python OpenCV視頻截取并保存實現(xiàn)代碼
這篇文章主要介紹了Python OpenCV視頻截取并保存實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11對numpy 數(shù)組和矩陣的乘法的進(jìn)一步理解
下面小編就為大家分享一篇對numpy 數(shù)組和矩陣的乘法的進(jìn)一步理解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04利用Python爬取微博數(shù)據(jù)生成詞云圖片實例代碼
這篇文章主要給大家介紹了關(guān)于利用Python爬取微博數(shù)據(jù)生成詞云圖片的相關(guān)資料,文中通過示例代碼介紹非常詳細(xì),對大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-08-08python爬蟲 正則表達(dá)式使用技巧及爬取個人博客的實例講解
下面小編就為大家?guī)硪黄猵ython爬蟲 正則表達(dá)式使用技巧及爬取個人博客的實例講解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10