Pengesahan ialah kaedah untuk memastikan pangkalan data kami hanya menerima jenis maklumat yang sesuai untuk setiap atribut. Lagipun, kami tidak mahu jenis data yang mengejut menemuinya ke dalam kod kami dan menyebabkan tingkah laku yang tidak dijangka. Nasib baik, SQLAlchemy mempunyai pakej yang membuat pengesahan cepat dan mudah!
Mari kita lihat beberapa contoh mudah. Bayangkan kita mempunyai model ringkas, Sandwich. Di sini kami telah memulakan pangkalan data kami dan mengimportnya daripada fail konfigurasi.
from config import db class Sandwich(db.Model): __tablename__ = 'sandwiches' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String) description = db.Column(db.String) price = db.Column(db.Float)
Jika kami ingin menambah pengesahan pada mana-mana atribut ini, kami perlu mengimport pakej pengesahan terlebih dahulu.
dari sqlalchemy.orm import mengesahkan
Dan kemudian, tulis fungsi kami dengan penghias '@validates' di dalam model.
@validates('name') def validate_name(self, key, value): if not value: raise ValueError('Name cannot be empty.') if type(value) != str: raise ValueError('Name must be a string.') return value
Jadi apa yang berlaku di sini? Mari kita pecahkan. @validates ialah penghias yang membolehkan ORM kami mengetahui untuk menghantar sebarang nilai yang diterima dengan kunci 'nama' melalui fungsi pengesahan kami sebelum menambahkannya pada pangkalan data. Nilai yang kami pulangkan adalah apa yang akhirnya diberikan kepada pangkalan data kami. Argumen "kunci" ialah kunci yang sedang dinilai, dalam kes ini 'nama', nilainya ialah nilai kunci itu, jadi nama sebenar (mudah-mudahan dalam teks) yang kami cuba tambahkan. Jadi di sini kita sedang menyemak untuk memastikan bahawa atribut nama yang diluluskan tidak kosong, dan itu sebenarnya rentetan. Jika tidak, kami menimbulkan ralat.
Kami juga boleh menjalankan berbilang atribut melalui penghias yang sama dengan menambahkannya pada hujahnya.
@validates('name', 'description') def validate_text(self, key, value): if not value: raise ValueError(f'{key} cannot be empty.') if type(value) != str: raise ValueError(f'{key} must be a string.') return value
Fungsi ini mengesahkan atribut nama dan perihalan kami, tetapi biasanya kami tidak akan mempunyai pengesahan yang sama untuk dilakukan pada atribut yang berbeza. Bergantung pada perbezaan dan bilangan pengesahan yang kami ada, kami boleh melakukannya dengan beberapa cara yang berbeza. Kami boleh menjalankan pengesah berasingan untuk atribut kami yang lain, mari tambahkan pengesahan panjang untuk penerangan dan pengesahan harga kami juga:
@validates('name') def validate_name(self, key, value): if not value: raise ValueError('Name cannot be empty.') if type(value) != str: raise ValueError('Name must be a string.') return value @validates('description') def validate_description(self, key, value): if not value: raise ValueError('Description cannot be empty.') if type(value) != str: raise ValueError('Description must be a string.') if not 10 <p>Atau, kita boleh menyimpan pengesah yang sama untuk kedua-duanya dan menggunakan hujah utama yang dihantar untuk melaraskan pengesahan yang dijalankan bagi setiap atribut.<br> </p> <pre class="brush:php;toolbar:false"> @validates('name', 'description', 'price') def validate(self, key, value): if key != 'price: if not value: raise ValueError(f'{key} cannot be empty.') if type(value) != str: raise ValueError(f'{key} must be string.') if key == 'description': if not 10 <p>Hmm, ini agak kucar-kacir, mari kita ubah semula kepada 2 pengesah yang berasingan.<br> </p> <pre class="brush:php;toolbar:false"> @validates('name', 'description') def validate_text(self, key, value): if not value: raise ValueError(f'{key} cannot be empty.') if type(value) != str: raise ValueError(f'{key} must be string.') if key == 'description': if not 10 <p>Itu lebih baik! Inilah model lengkap kami:<br> </p> <pre class="brush:php;toolbar:false">from sqlalchemy.orm import validates from config import db class Sandwich(db.Model): __tablename__ = 'sandwiches' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String) description = db.Column(db.String) price = db.Column(db.Float) @validates('name', 'description') def validate_text(self, key, value): if not value: raise ValueError(f'{key} cannot be empty.') if type(value) != str: raise ValueError(f'{key} must be string.') if key == 'description': if not 10 <p>Itu sahaja! Pengesahan ialah satu alat mudah untuk memastikan pangkalan data anda kekal betul dan betul.</p>
Atas ialah kandungan terperinci Pengesah. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!