無錫網(wǎng)站設(shè)計(jì) 眾海外營銷推廣服務(wù)
博客目錄
- 一、SQLAlchemy 查詢基礎(chǔ)
- 二、or\_操作符的使用場(chǎng)景與實(shí)現(xiàn)
- 1. or\_操作符的基本概念
- 2. 典型應(yīng)用場(chǎng)景
- 3. or\_操作符的優(yōu)勢(shì)
- 4. 高級(jí)用法
- 三、in\_操作符的簡潔替代方案
- 1. in\_操作符簡介
- 2. 使用示例
- 3. in\_操作符的優(yōu)勢(shì)
- 4. 注意事項(xiàng)
- 四、or*與 in*的性能比較
- 五、實(shí)際應(yīng)用中的最佳實(shí)踐
- 六、其他相關(guān)操作符
- 七、復(fù)雜查詢示例
在現(xiàn)代 Web 應(yīng)用開發(fā)中,數(shù)據(jù)庫查詢是不可或缺的核心功能。SQLAlchemy 作為 Python 中最流行的 ORM 工具之一,提供了強(qiáng)大而靈活的查詢接口。
一、SQLAlchemy 查詢基礎(chǔ)
SQLAlchemy 的查詢構(gòu)建基于其強(qiáng)大的表達(dá)式語言,允許開發(fā)者以 Pythonic 的方式構(gòu)建復(fù)雜的 SQL 查詢?;镜牟樵兘Y(jié)構(gòu)通常包括session.query()
方法配合filter()
方法使用,后者用于添加各種條件限制。
例如,一個(gè)簡單的查詢可能如下:
from models import ProviderModel# 查詢所有配置不為空的ProviderModel記錄
records = db.session.query(ProviderModel).filter(ProviderModel.encrypted_config.isnot(None)
).all()
在實(shí)際業(yè)務(wù)場(chǎng)景中,我們經(jīng)常需要更復(fù)雜的查詢條件,特別是當(dāng)某個(gè)字段需要匹配多個(gè)可能值時(shí)。這時(shí)就需要引入邏輯操作符來構(gòu)建復(fù)合條件。
二、or_操作符的使用場(chǎng)景與實(shí)現(xiàn)
1. or_操作符的基本概念
SQLAlchemy 的or_
操作符用于實(shí)現(xiàn)邏輯"或"運(yùn)算,允許查詢滿足多個(gè)條件中至少一個(gè)的記錄。它對(duì)應(yīng)于 SQL 中的 OR 關(guān)鍵字,但在 SQLAlchemy 中以函數(shù)式的方式使用。
2. 典型應(yīng)用場(chǎng)景
在文章開頭提到的例子中,我們需要查詢model_type
字段值為’text-generation’或’embeddings’的記錄。使用or_
操作符的解決方案如下:
from sqlalchemy import or_provider_models = db.session.query(ProviderModel).filter(ProviderModel.encrypted_config.isnot(None),ProviderModel.provider_name != 'openai',or_(ProviderModel.model_type == 'text-generation',ProviderModel.model_type == 'embeddings'),ProviderModel.conf_type == '0'
).all()
3. or_操作符的優(yōu)勢(shì)
- 明確性:清晰地表達(dá)了"或"邏輯關(guān)系,代碼可讀性強(qiáng)
- 靈活性:可以組合任意數(shù)量和類型的條件
- 可擴(kuò)展性:可以與其他邏輯操作符(如
and_
,not_
)嵌套使用
4. 高級(jí)用法
or_
操作符可以嵌套使用,構(gòu)建更復(fù)雜的邏輯:
from sqlalchemy import and_, or_# 更復(fù)雜的條件組合
query = db.session.query(ProviderModel).filter(or_(and_(ProviderModel.model_type == 'text-generation',ProviderModel.provider_name.like('%ai%')),and_(ProviderModel.model_type == 'embeddings',ProviderModel.conf_type.in_(['0', '1'])))
)
三、in_操作符的簡潔替代方案
1. in_操作符簡介
當(dāng)需要檢查字段值是否存在于一個(gè)預(yù)定義的集合中時(shí),in_
操作符提供了更簡潔的語法。它對(duì)應(yīng)于 SQL 中的 IN 關(guān)鍵字。
2. 使用示例
同樣的查詢需求可以用in_
操作符更簡潔地表達(dá):
provider_models = db.session.query(ProviderModel).filter(ProviderModel.encrypted_config.isnot(None),ProviderModel.provider_name != 'openai',ProviderModel.model_type.in_(['text-generation', 'embeddings']),ProviderModel.conf_type == '0'
).all()
3. in_操作符的優(yōu)勢(shì)
- 簡潔性:代碼更短,更易讀
- 性能:數(shù)據(jù)庫通常對(duì) IN 操作有優(yōu)化
- 可維護(hù)性:當(dāng)需要添加更多匹配值時(shí),只需擴(kuò)展列表
4. 注意事項(xiàng)
- 對(duì)于非常大的值列表(如上千個(gè)),IN 查詢可能性能不佳
- 某些數(shù)據(jù)庫對(duì) IN 列表的長度有限制
- 對(duì)于 NULL 值的處理需要特別注意
四、or與 in的性能比較
在實(shí)際應(yīng)用中,or_
和in_
在功能上是等價(jià)的,但性能表現(xiàn)可能有所不同:
- 小規(guī)模數(shù)據(jù):兩者性能差異不大
- 大規(guī)模數(shù)據(jù):
in_
通常更高效,特別是當(dāng)數(shù)據(jù)庫能夠使用索引時(shí) - 執(zhí)行計(jì)劃:不同數(shù)據(jù)庫可能對(duì)這兩種寫法生成不同的執(zhí)行計(jì)劃
建議在實(shí)際應(yīng)用中通過 EXPLAIN 分析兩種寫法的執(zhí)行計(jì)劃,選擇最優(yōu)方案。
五、實(shí)際應(yīng)用中的最佳實(shí)踐
- 代碼可讀性優(yōu)先:對(duì)于少量選項(xiàng)(2-3 個(gè)),
or_
可能更清晰;對(duì)于更多選項(xiàng),in_
更合適 - 動(dòng)態(tài)條件構(gòu)建:當(dāng)條件需要?jiǎng)討B(tài)生成時(shí),
in_
通常更方便 - 混合使用:復(fù)雜查詢中可以混合使用兩種方式
- 測(cè)試驗(yàn)證:始終驗(yàn)證生成的 SQL 是否符合預(yù)期
# 動(dòng)態(tài)構(gòu)建查詢條件的例子
allowed_types = get_allowed_model_types() # 返回['text-generation', 'embeddings', ...]query = db.session.query(ProviderModel).filter(ProviderModel.model_type.in_(allowed_types)
)
六、其他相關(guān)操作符
除了or_
和in_
,SQLAlchemy 還提供了其他有用的操作符:
- and_:邏輯"與"(通常用逗號(hào)隱式表示)
- not_:邏輯"非"
- like/ilike:模式匹配
- between:范圍查詢
- is_null/isnot_null:NULL 值檢查
七、復(fù)雜查詢示例
結(jié)合多種操作符的復(fù)雜查詢示例:
from sqlalchemy import and_, or_, not_query = db.session.query(ProviderModel).filter(ProviderModel.encrypted_config.isnot(None),or_(and_(ProviderModel.provider_name != 'openai',ProviderModel.model_type.in_(['text-generation', 'embeddings'])),and_(ProviderModel.provider_name == 'special',not_(ProviderModel.model_type == 'deprecated'))),ProviderModel.conf_type == '0'
).order_by(ProviderModel.created_at.desc())
覺得有用的話點(diǎn)個(gè)贊
👍🏻
唄。
??????本人水平有限,如有紕漏,歡迎各位大佬評(píng)論批評(píng)指正!😄😄😄💘💘💘如果覺得這篇文對(duì)你有幫助的話,也請(qǐng)給個(gè)點(diǎn)贊、收藏下吧,非常感謝!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且長,行則將至,讓我們一起加油吧!🌙🌙🌙