ฉันต้องการค้นหาฐานข้อมูล SQLAlchemy โดยid
สิ่งที่คล้ายกับ
User.query.filter_by (ชื่อผู้ใช้ = 'ปีเตอร์')
แต่สำหรับ id. ฉันต้องทำอย่างไร [การค้นหาผ่าน Google และ SO ไม่ช่วย]
ฉันต้องการค้นหาฐานข้อมูล SQLAlchemy โดยid
สิ่งที่คล้ายกับ
User.query.filter_by (ชื่อผู้ใช้ = 'ปีเตอร์')
แต่สำหรับ id. ฉันต้องทำอย่างไร [การค้นหาผ่าน Google และ SO ไม่ช่วย]
คำตอบ:
Query มีฟังก์ชัน getที่รองรับการสืบค้นด้วยคีย์หลักของตารางซึ่งฉันคิดว่านั่นid
คือ
ตัวอย่างเช่นในการค้นหาวัตถุที่มี ID 23:
User.query.get(23)
หมายเหตุ: ดังที่ผู้แสดงความคิดเห็นและคำตอบอื่น ๆ ได้กล่าวถึงนี่ไม่ใช่แค่ชวเลขสำหรับ "ดำเนินการกรองคำค้นหาบนคีย์หลัก" ขึ้นอยู่กับสถานะของเซสชัน SQLAlchemy การเรียกใช้รหัสนี้อาจสอบถามฐานข้อมูลและส่งคืนอินสแตนซ์ใหม่หรืออาจส่งคืนอินสแตนซ์ของวัตถุที่สอบถามก่อนหน้านี้ในรหัสของคุณโดยไม่ต้องสอบถามฐานข้อมูลจริงๆ หากคุณยังไม่ได้ดำเนินการให้ลองอ่านเอกสารประกอบใน SQLAlchemy Sessionเพื่อทำความเข้าใจเกี่ยวกับการแบ่งส่วน
YourModel.query.get((pk1, pk2))
ฟังก์ชั่นได้รับนอกจากนี้ยังสนับสนุนคีย์หลักหลาย สังเกตทูเพิล
คุณสามารถสอบถาม User ด้วย id = 1 เช่นนี้
session.query(User).get(1)
get () ไม่เป็นไปตามที่คุณคาดหวังในบางครั้ง:
หากการทำธุรกรรมของคุณเสร็จสิ้น:
>>> 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')>
หากคุณอยู่ในธุรกรรม (get () จะให้วัตถุผลลัพธ์ในหน่วยความจำโดยไม่ต้องสืบค้นฐานข้อมูล):
>>> session.query(User).get(1)
<User(u'ed', u'Ed Jones')>
ดีกว่าที่จะใช้สิ่งนี้:
>>> 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()
ดูเหมือนว่าจะให้วัตถุผลลัพธ์ในหน่วยความจำแก่คุณ (โดยไม่ต้องค้นหาฐานข้อมูลจริง) แต่filter().first()
จะทำการค้นหาฐานข้อมูลเสมอ
get
จะดีกว่าเนื่องจากประสิทธิภาพที่เพิ่มขึ้น
get
นี้มีประสิทธิภาพมากกว่า
หากคุณใช้tables reflection
คุณอาจมีปัญหากับแนวทางแก้ไขที่ให้ไว้ (วิธีแก้ปัญหาก่อนหน้านี้ไม่ได้ผลสำหรับฉัน)
สิ่งที่ฉันใช้คือ:
session.query(object._class_).get(id)
( object
ถูกดึงมาโดยการสะท้อนจากฐานข้อมูลนี่คือเหตุผลที่คุณต้องใช้.__class__
)
ฉันหวังว่านี่จะช่วยได้.
ขั้นแรกคุณควรตั้งค่าid
เป็นคีย์หลัก
จากนั้นคุณสามารถใช้query.get()
วิธีการค้นหาวัตถุid
ที่เป็นคีย์หลักอยู่แล้ว
เนื่องจากquery.get()
วิธีการสืบค้นวัตถุด้วยคีย์หลัก
อ้างอิงจากเอกสาร 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)