Sqlalchemy: طريقة أفضل للتحديث مع التصريح؟
-
26-09-2019 - |
سؤال
أنا sqlalchemy noob.
لنفترض أن لدي جدول مستخدم في الوضع التصريحي:
class User(Base):
__tablename__ = 'user'
id = Column(u'id', Integer(), primary_key=True)
name = Column(u'name', String(50))
عندما أعرف معرف المستخدم بدون تحميل كائن في جلسة ، أقوم بتحديث هذا المستخدم مثل هذا:
ex = update(User.__table__).where(User.id==123).values(name=u"Bob Marley")
Session.execute(ex)
أنا لا أحب استخدام User.__table__
, ، هل يجب أن أتوقف عن القلق مع ذلك؟
هل هناك طريقة أفضل للقيام بذلك؟
شكرًا!
المحلول
هناك أيضًا بعض إمكانات التحديث على مستوى ORM. لا يتعامل مع أي حالات صعبة حتى الآن ، ولكن للحالة التافهة لتحديث الصف الواحد (أو التحديث بالجملة) ، فهو يعمل بشكل جيد. حتى أنه يتجاوز أي كائنات تم تحميلها بالفعل وتطبق التحديث عليها أيضًا. يمكنك استخدامه مثل هذا:
session.query(User).filter_by(id=123).update({"name": u"Bob Marley"})
نصائح أخرى
أنت تعمل على بند المستوى هنا ، وليس على مستوى النموذج/الكيان/الكائن. مستوى البند أقل من الكائنات المعينة. ونعم ، يجب القيام بشيء لتحويل مصطلح واحد إلى آخرين.
يمكنك أيضًا البقاء على مستوى الكائن والقيام:
session = Session()
u = session.query(User).get(123)
u.name = u"Bob Marley"
session.commit()
ولكن سيكون أبطأ بكثير لأنه يؤدي إلى بناء الكائن المعينة. ولست متأكدًا من أنه أكثر قابلية للقراءة.
في المثال الخاص بك ، أرى الحل الأكثر طبيعية و "الصحيح". لن أقلق على القليل __table__
سحر.
تتوفر وظائف مماثلة عبر update()
طريقة على كائن الجدول.
class User(Base):
__tablename__ = 'user'
id = Column('id', Integer(), primary_key=True)
name = Column('name', String(50))
stmt = User.__table__.update().where(User.id==5).values(name='user #5')
ليستخدم User.__table__
هو كيف تم القيام به في Sqlalchemy.