検証は、データベースが各属性に適切な種類の情報のみを受信することを保証する方法です。結局のところ、予期せぬタイプのデータがコードに侵入して予期しない動作を引き起こすことは望ましくありません。幸いなことに、SQLAlchemy には検証を迅速かつ簡単に行うためのパッケージがあります。
簡単な例をいくつか見てみましょう。 Sandwich という単純なモデルがあると想像してください。ここではデータベースをすでに初期化しており、構成ファイルからインポートしています。
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)
これらの属性のいずれかに検証を追加したい場合は、最初に検証パッケージをインポートする必要があります。
sqlalchemy.orm からインポートを検証します
次に、モデル内に「@validates」デコレータを使用して関数を作成します。
@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 は、「name」キーで受け取った値をデータベースに追加する前に検証関数を通じて渡すことを ORM に知らせるデコレーターです。私たちが返す値は、最終的にデータベースに与えられる値です。 「key」引数は評価されるキーであり、この場合は「name」です。値はそのキーの値であり、追加しようとしている実際の名前(できればテキスト内)です。したがって、ここでは、渡された name 属性が空ではなく、実際には文字列であることを確認しています。そうでない場合は、エラーが発生します。
複数の属性を引数に追加することで、同じデコレータを介して複数の属性を実行することもできます。
@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
この関数は名前と説明の属性を検証しますが、通常は異なる属性に対して同じ検証を実行することはありません。検証の違いと検証の数に応じて、いくつかの異なる方法で実行できます。他の属性に対して別のバリデータを実行できます。説明と価格の検証にも長さの検証を追加しましょう:
@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>または、両方に同じバリデーターを保持し、渡されたキー引数を使用して各属性に対してどの検証を実行するかを調整することもできます。<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>うーん、これは少し面倒なので、2 つの別々のバリデーターにリファクタリングしましょう。<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>そのほうがいいですよ!完成したモデルは次のとおりです:<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>それだけです!検証は、データベースが適切な状態にあることを確認するための簡単なツールの 1 つです。</p>
以上が検証者の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。