سؤال

افترض أن الجدول يحتوي على ثلاثة أعمدة: username, password و no_of_logins.

عندما يحاول المستخدم تسجيل الدخول، يتم التحقق من وجود إدخال باستعلام مثل

user = User.query.filter_by(username=form.username.data).first()

إذا تطابقت كلمة المرور، فإنه يستمر أكثر.ما أود فعله هو حساب عدد المرات التي قام فيها المستخدم بتسجيل الدخول.وبالتالي كلما قام بتسجيل الدخول بنجاح، أود زيادة no_of_logins الحقل وتخزينه مرة أخرى إلى جدول المستخدم.لست متأكدًا من كيفية تشغيل استعلام التحديث باستخدام SqlAlchemy.

هل كانت مفيدة؟

المحلول

user.no_of_logins += 1
session.commit()

نصائح أخرى

هناك عدة طرق ل UPDATE استخدام sqlalchemy

1) user.no_of_logins += 1
   session.commit()

2) session.query().\
       filter(User.username == form.username.data).\
       update({"no_of_logins": (User.no_of_logins +1)})
   session.commit()

3) conn = engine.connect()
   stmt = User.update().\
       values(no_of_logins=(User.no_of_logins + 1)).\
       where(User.username == form.username.data)
   conn.execute(stmt)

4) setattr(user, 'no_of_logins', user.no_of_logins+1)
   session.commit()

أمثلة لتوضيح المسألة المهمة في تعليقات الإجابة المقبولة

لم أفهمها حتى لعبت بها بنفسي، لذلك اعتقدت أنه سيكون هناك آخرون مرتبكون أيضًا.لنفترض أنك تعمل على المستخدم الذي id == 6 ومن no_of_logins == 30 عندما تبدأ.

# 1 (bad)
user.no_of_logins += 1
# result: UPDATE user SET no_of_logins = 31 WHERE user.id = 6

# 2 (bad)
user.no_of_logins = user.no_of_logins + 1
# result: UPDATE user SET no_of_logins = 31 WHERE user.id = 6

# 3 (bad)
setattr(user, 'no_of_logins', user.no_of_logins + 1)
# result: UPDATE user SET no_of_logins = 31 WHERE user.id = 6

# 4 (ok)
user.no_of_logins = User.no_of_logins + 1
# result: UPDATE user SET no_of_logins = no_of_logins + 1 WHERE user.id = 6

# 5 (ok)
setattr(user, 'no_of_logins', User.no_of_logins + 1)
# result: UPDATE user SET no_of_logins = no_of_logins + 1 WHERE user.id = 6

النقطة

من خلال الرجوع إلى الفئة بدلاً من المثيل، يمكنك جعل SQLAlchemy أكثر ذكاءً فيما يتعلق بالتزايد، وتحقيق ذلك على جانب قاعدة البيانات بدلاً من جانب Python.يعد القيام بذلك داخل قاعدة البيانات أفضل لأنه أقل عرضة لفساد البيانات (على سبيل المثال.يحاول عميلان الزيادة في نفس الوقت بنتيجة صافية تتمثل في زيادة واحدة فقط بدلاً من اثنتين).أفترض أنه من الممكن القيام بالزيادة في بايثون إذا قمت بتعيين الأقفال أو رفع مستوى العزل، ولكن لماذا تهتم إذا لم تكن مضطرًا إلى ذلك؟

تحذير

إذا كنت ستقوم بالزيادة مرتين عبر الكود الذي ينتج SQL مثل SET no_of_logins = no_of_logins + 1, ، فستحتاج إلى الالتزام بالزيادات أو على الأقل التدفق بينها، وإلا فلن تحصل إلا على زيادة واحدة فقط:

# 6 (bad)
user.no_of_logins = User.no_of_logins + 1
user.no_of_logins = User.no_of_logins + 1
session.commit()
# result: UPDATE user SET no_of_logins = no_of_logins + 1 WHERE user.id = 6

# 7 (ok)
user.no_of_logins = User.no_of_logins + 1
session.flush()
# result: UPDATE user SET no_of_logins = no_of_logins + 1 WHERE user.id = 6
user.no_of_logins = User.no_of_logins + 1
session.commit()
# result: UPDATE user SET no_of_logins = no_of_logins + 1 WHERE user.id = 6

بمساعدة user=User.query.filter_by(username=form.username.data).first() بيان سوف تحصل على المستخدم المحدد فيه user عامل.

الآن يمكنك تغيير قيمة متغير الكائن الجديد مثل user.no_of_logins += 1 وحفظ التغييرات مع sessionطريقة الالتزام.

لقد كتبت بوت برقية، ولدي بعض المشاكل مع صفوف التحديث.استخدم هذا المثال، إذا كان لديك Model

def update_state(chat_id, state):
    try:
        value = Users.query.filter(Users.chat_id == str(chat_id)).first()
        value.state = str(state)
        db.session.flush()
        db.session.commit()
        #db.session.close()
    except:
        print('Error in def update_state')

لماذا الاستخدام db.session.flush()؟ولهذا >>> SQLAlchemy:ما الفرق بين التدفق () والالتزام ()؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top