Asumsikan tabel memiliki tiga kolom: username
, password
dan no_of_logins
.
Ketika pengguna mencoba masuk, itu diperiksa untuk entri dengan pertanyaan seperti
user = User.query.filter_by(username=form.username.data).first()
Jika kata sandi cocok, ia melanjutkan. Yang ingin saya lakukan adalah menghitung berapa kali pengguna login. Jadi, setiap kali ia berhasil masuk, saya ingin menambah no_of_logins
bidang dan menyimpannya kembali ke tabel pengguna. Saya tidak yakin bagaimana menjalankan permintaan pembaruan dengan SqlAlchemy.
python
sqlalchemy
flask-sqlalchemy
webminal.org
sumber
sumber
user.no_of_logins += 1
dapat menciptakan kondisi balapan. Sebaliknya gunakanuser.no_of_logins = user.no_of_logins + 1
. Diterjemahkan ke dalam sql cara yang benar yang terakhir menjadi:SET no_of_logins = no_of_logins + 1
.user.no_of_logins = User.no_of_logins + 1
, atau dengan kata lain menggunakan atribut instrumented model untuk menghasilkan ekspresi SQL. Karena komentar Anda menampilkan 2 cara untuk menghasilkan kondisi balapan yang sama.Ada beberapa cara untuk
UPDATE
menggunakannyasqlalchemy
sumber
setattr(query_result, key, value)
untuk beberapa pembaruan dalam Flask SQLAlchemy diikuti oleh komit. Ada alasan untuk mendiskon pola ini?setattr(query_result, key, value)
, yang persis sama dengan menulisquery_result.key = value
Contoh untuk memperjelas masalah penting dalam komentar jawaban yang diterima
Saya tidak mengerti sampai saya bermain-main dengan itu sendiri, jadi saya pikir akan ada orang lain yang bingung juga. Katakanlah Anda bekerja pada pengguna yang
id == 6
dan yangno_of_logins == 30
ketika Anda mulai.Inti nya
Dengan mereferensikan kelas alih-alih instance, Anda bisa membuat SQLAlchemy menjadi lebih pintar tentang penambahan, membuatnya terjadi di sisi basis data alih-alih sisi Python. Melakukannya di dalam basis data lebih baik karena kurang rentan terhadap korupsi data (misalnya, dua klien berupaya untuk meningkatkan secara bersamaan dengan hasil bersih hanya satu peningkatan daripada dua). Saya menganggap itu mungkin untuk melakukan penambahan dengan Python jika Anda mengatur kunci atau meningkatkan level isolasi, tetapi mengapa repot-repot jika Anda tidak harus melakukannya?
Peringatan
Jika Anda akan bertambah dua kali melalui kode yang menghasilkan SQL like
SET no_of_logins = no_of_logins + 1
, maka Anda harus melakukan atau setidaknya menyiram di antara kenaikan, atau Anda hanya akan mendapatkan satu kenaikan secara total:sumber
Dengan bantuan
user=User.query.filter_by(username=form.username.data).first()
pernyataan, Anda akan mendapatkan pengguna yang ditentukan dalamuser
variabel.Sekarang Anda dapat mengubah nilai variabel objek baru seperti
user.no_of_logins += 1
dan menyimpan perubahan dengansession
metode komit.sumber
Saya menulis bot telegram, dan memiliki beberapa masalah dengan baris pembaruan. Gunakan contoh ini, jika Anda memiliki Model
Mengapa menggunakan
db.session.flush()
? Itu sebabnya >>> SQLAlchemy: Apa perbedaan antara flush () dan commit ()?sumber
flush()
selalu dipanggil sebagai bagian dari panggilan untukcommit()
"