Truy vấn Flask-SQLAlchemy không phân biệt chữ hoa chữ thường


96

Tôi đang sử dụng Flask-SQLAlchemy để truy vấn từ cơ sở dữ liệu người dùng; tuy nhiên, trong khi

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

sẽ trở lại

<User u'ganye'>

đang làm

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

trả lại

None

Tôi tự hỏi liệu có cách nào để truy vấn cơ sở dữ liệu theo cách không phân biệt chữ hoa chữ thường hay không để ví dụ thứ hai vẫn trả về

<User u'ganye'>

Câu trả lời:


193

Bạn có thể làm điều đó bằng cách sử dụng một trong hai lowerhoặc upperchức năng trong bộ lọc của bạn:

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

Một tùy chọn khác là thực hiện tìm kiếm bằng cách sử dụng ilikethay vì like:

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

3
Điều này có làm cho truy vấn chậm hơn so với filter_byphương pháp mà cột tên người dùng được lập chỉ mục không?
CaptainDaVinci,

13

Cải thiện câu trả lời của @ plaes, câu trả lời này sẽ làm cho truy vấn ngắn hơn nếu bạn chỉ chỉ định (các) cột bạn cần:

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

Ví dụ trên rất hữu ích trong trường hợp một người cần sử dụng jsonify của Flask cho mục đích AJAX và sau đó trong javascript của bạn truy cập nó bằng data.result :

from flask import jsonify
jsonify(result=user)

@ VedranŠego Tôi đã xem liên kết, cảm ơn đã tham khảo. Tôi cũng sẽ thực hiện bài kiểm tra của riêng mình.
iChux

3

bạn có thể làm

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

Hoặc bạn có thể sử dụng chức năng ilike

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

Tùy chọn thứ hai không nên có tỷ lệ phần trăm
axwell
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.