แบบสอบถามกรณีไม่ไวต่อ Flask-SQLAlchemy


100

ฉันใช้ Flask-SQLAlchemy เพื่อค้นหาจากฐานข้อมูลของผู้ใช้ อย่างไรก็ตามในขณะที่

user = models.User.query.filter_by(username="ganye").first()

จะกลับมา

<User u'ganye'>

ทำ

user = models.User.query.filter_by(username="GANYE").first()

ผลตอบแทน

None

ฉันสงสัยว่ามีวิธีสืบค้นฐานข้อมูลแบบไม่คำนึงถึงตัวพิมพ์หรือไม่เพื่อให้ตัวอย่างที่สองยังคงกลับมา

<User u'ganye'>

คำตอบ:


204

คุณสามารถทำได้โดยใช้lowerหรือupperฟังก์ชั่นในตัวกรองของคุณ:

from sqlalchemy import func
user = models.User.query.filter(func.lower(User.username) == func.lower("GaNyE")).first()

อีกทางเลือกหนึ่งคือทำการค้นหาโดยใช้ilikeแทนlike:

.query.filter(Model.column.ilike("ganye"))

3
สิ่งนี้จะทำให้การสืบค้นช้าลงเมื่อเทียบกับfilter_byวิธีการจัดทำดัชนีคอลัมน์ชื่อผู้ใช้หรือไม่
CaptainDaVinci

ilikeจะทำงานให้สมบูรณ์ขอบคุณ ..
Biskrem Muhammad

13

การปรับปรุงคำตอบของ @ plaes คำตอบนี้จะทำให้แบบสอบถามสั้นลงหากคุณระบุเฉพาะคอลัมน์ที่คุณต้องการ:

user = models.User.query.with_entities(models.User.username).\
filter(models.User.username.ilike("%ganye%")).all()

ตัวอย่างข้างต้นมีประโยชน์มากในกรณีที่จำเป็นต้องใช้ jsonify ของ Flask เพื่อวัตถุประสงค์ AJAX จากนั้นในจาวาสคริปต์ของคุณจะเข้าถึงโดยใช้data.result :

from flask import jsonify
jsonify(result=user)

@ VedranŠegoฉันเห็นลิงค์แล้วขอบคุณสำหรับข้อมูลอ้างอิง ฉันจะทำการทดสอบของตัวเองด้วย
iChux

4

คุณทำได้

user = db.session.query(User).filter_by(func.lower(User.username)==func.lower("GANYE")).first()

หรือคุณสามารถใช้ฟังก์ชัน ilike

 user = db.session.query(User).filter_by(User.username.ilike("%ganye%")).first()

1
ตัวเลือกที่สองไม่ควรมีเปอร์เซ็นต์
axwell
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.