Tôi cần truy vấn cơ sở dữ liệu SQLAlchemy bằng id
cái gì đó tương tự như
User.query.filter_by (tên người dùng = 'peter')
nhưng đối với id. Làm thế nào để tôi làm điều này? [Tìm kiếm trên Google và SO không giúp được gì]
Tôi cần truy vấn cơ sở dữ liệu SQLAlchemy bằng id
cái gì đó tương tự như
User.query.filter_by (tên người dùng = 'peter')
nhưng đối với id. Làm thế nào để tôi làm điều này? [Tìm kiếm trên Google và SO không giúp được gì]
Câu trả lời:
Truy vấn có một hàm get hỗ trợ truy vấn bằng khóa chính của bảng, tôi giả sử là như vậy id
.
Ví dụ: để truy vấn một đối tượng có ID là 23:
User.query.get(23)
Lưu ý: Như một số người bình luận và câu trả lời khác đã đề cập, đây không chỉ là cách viết tắt của "Thực hiện lọc truy vấn trên khóa chính". Tùy thuộc vào trạng thái của phiên SQLAlchemy, việc chạy mã này có thể truy vấn cơ sở dữ liệu và trả về một phiên bản mới hoặc nó có thể trả về một phiên bản của đối tượng được truy vấn trước đó trong mã của bạn mà không thực sự truy vấn cơ sở dữ liệu. Nếu bạn chưa làm như vậy, hãy xem xét việc đọc tài liệu về SQLAlchemy Session để hiểu các phân nhánh.
YourModel.query.get((pk1, pk2))
. Chú ý bộ tuple.
Bạn có thể truy vấn Người dùng có id = 1 như thế này
session.query(User).get(1)
get () đôi khi không như bạn mong đợi:
nếu giao dịch của bạn đã được thực hiện:
>>> session.query(User).get(1)
[SQL]: BEGIN (implicit)
[SQL]: SELECT user.id AS user_id, user.name AS user_name, user.fullname AS user_fullname
FROM user
WHERE user.id = ?
[SQL]: (1,)
<User(u'ed', u'Ed Jones')>
nếu bạn đang trong một giao dịch (get () sẽ cung cấp cho bạn đối tượng kết quả trong bộ nhớ mà không cần truy vấn cơ sở dữ liệu):
>>> session.query(User).get(1)
<User(u'ed', u'Ed Jones')>
tốt hơn để sử dụng cái này:
>>> session.query(User.name).filter(User.id == 1).first()
[SQL]: SELECT user.name AS user_name
FROM user
WHERE user.id = ?
LIMIT ? OFFSET ?
[SQL]: (1, 1, 0)
(u'Edwardo',)
get()
dường như cung cấp cho bạn đối tượng kết quả trong bộ nhớ (mà không thực sự truy vấn cơ sở dữ liệu), nhưng filter().first()
sẽ luôn truy vấn cơ sở dữ liệu.
get
tốt hơn do tăng hiệu quả.
get
nó hiệu quả hơn.
Nếu bạn sử dụng, tables reflection
bạn có thể gặp sự cố với các giải pháp được đưa ra. (Các giải pháp trước đây ở đây không hiệu quả với tôi).
Những gì tôi đã sử dụng cuối cùng là:
session.query(object._class_).get(id)
( object
được truy xuất bằng cách phản ánh từ cơ sở dữ liệu, đây là lý do tại sao bạn cần sử dụng .__class__
)
Tôi hi vọng cái này giúp được.
Đầu tiên, bạn nên đặt id
làm khóa chính.
Sau đó, bạn có thể sử dụng query.get()
phương pháp này để truy vấn các đối tượng id
đã là khóa chính.
Kể từ khi query.get()
phương pháp truy vấn đối tượng bằng khóa chính.
Suy ra từ tài liệu Flask-SQLAlchemy
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
db = SQLAlchemy()
db.init_app(app)
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
def test():
id = 1
user = User.query.get(id)