多対多の関係ユーザの管理はじめにこれまで、HTMLとCSSを使って簡単なWebページを構築する方法、GitとGitHubを使ってコードの変更を追跡し、他の人と共同作業するための方法について説明してきました。Pythonプログラミング言語にも慣れ、Webアプリケーションの作成にDjangoを使い始めました。本日は、SQLモデルとDjangoモデルを使用してデータを効率的に保存し、アクセスする方法について学習します。データベースの更新とクエリを可能にするプログラミング言語です。データベースSQL言語の使用方法に入る前に、データの格納方法について説明します。SQLを使用する場合は、多数のテーブルに格納されているすべてのデータを検索できるリレーショナル・データベースを使用します。これらの各テーブルは、設定した列数と任意の行数で構成されています。SQLを使用する方法を説明するために、フライトと乗客を管理するために使用される航空会社のWebサイトの例を使用します。次のテーブルでは、複数のフライトを管理しています。情報の格納に一般的に使用され、SQLコマンドで簡単に利用できるリレーショナル・データベース管理システムには、次のようなものがあります。MySQLPostgreSQLSQLite...最初の2つのMySQLとPostgreSQLは、通常はWebサイトを実行するサーバーとは別のサーバーで実行される、髙い負荷に耐えられるデータベース管理システムです。SQLiteはすべてのデータを1つのファイルに格納できる軽量のシステムです。このコースでは、Djangoが使用するデフォルト・システムであるSQLiteを使用します。列の型Pythonでいくつかの異なる変数型を扱ったように、SQLiteには異なる形式の情報を表す型があります。他の管理システムは異なるデータ型を持っているかもしれませんが、どれもSQLiteとかなり似ています。Object):データベースに格納するその他のバイナリデータ(例:画像)テーブルSQLを使用したデータベースへの接続を実際に開始するには、まず新しいテーブルを作成します。新しいテーブルを作成するコマンドは、次のようになります。いう名前の新しいテーブルを作成し、このテーブルに4つの列を追加します。id:テーブル内の各行を一意に識別できる番号を設定すると便利です。整数であることと、それが主キーであること、つまり一意の識別子であることを指定しました。これは、テーブルに追加するたびにIDを指定する必要がないことを意味します。IDは自動的に指定されるためです。記述することにより、値が必須になります。destination:ここでも、これがテキストフィールドになるように指定し、NULLを禁止します。duration:この値もNULLにはできませんが、今回はテキストではなく整数で表されます。制約を見ましたが、他の制約も利用できます。CHECK:行の追加/変更を許可する前に、指定された制約が満たされていなければなりません。DEFAULT:値が指定されていない場合にデフォルト値を提供します。NULL:値が指定されていることが必要です。KEY:データベース内の行を検索する主な方法であることを示します。UNIQUE:その列で同じ値を持つ行があってはいけません。...ここまではテーブルの作成方法について説明しました。次に、テーブルに行を追加する方法について説明します。コマンドを使用してこれを行います。対応するカラムのリストと同じ順序になるようにしています。自動的にインクリメントされるため、値を指定する必要はありません。SELECTテーブルに行を追加したら、そのテーブル内のデータにアクセスする方法が必要になるでしょう。これは、SQLのSELECTクエリーを使用して行います。クエリは、次のようになります。フライトテーブルからすべてのデータを取得します。実際にはデータベースのすべてのカラムが必要なわけではなく、originとdestinationだけが必要な場合もあります。これらの列のみにアクセスするには、*をアクセス先の列名に置き換えます。次のクエリは、すべての出発地と目的地を返します。flights;テーブルが大きくなるにつれて、クエリが返す行を絞り込む必要も出てきます。これを行うには、WHEREの後に条件を追加します。なく、任意の列でもフィルタリングできます。基本的なSQLコマンドがいくつかわかったので、ターミナルでテストしてみましょう。Browserをダウンロードすることもできます)。実行して、データベースのファイルを作成します。実行すると、SQLiteプロンプトが表示され、SQLコマンドを実行できます。435また、フライトを除外するために、等号だけでなく、不等号も使うことができます。整数値と実数値には、>または<を使用できます。OR)を使用することもできます。"Paris";また、キーワードINを使用して、データの一部が次のいずれかにあてはまるかどうかを確認することもできます。"Lima");キーワードLIKEを使用して単語をより広範に検索するために、正規表現を使用することもできます。持つすべての結果を検索します。"%a%";関数クエリの結果に適用できるSQL関数もいくつかあります。これらは、クエリによって返されるすべてのデータではなく、データの要約統計のみが必要な場合に便利です。AVERAGE(平均)COUNT(個数)MAX(最大)MIN(最小)SUM(合計)...UPDATEテーブルを追加して検索する方法を見てきましたが、すでに存在するテーブルの行を更新したい場合もあります。これを行うには、次に示すようにUPDATEコマンドを使用します。単語の意味からコマンドの意味がわかると思いますが、このコマンドはニューヨークからロンドンに向かうフライトをすべて見つけ、その所要時間を430に設定します。"London";DELETEまた、データベースから行を削除する機能が必要な場合もあります。これにはDELETEコマンドを使用します。次のコードは、東京に着陸するすべての便を削除します。"Tokyo";その他の文クエリの結果を制御するために使用できる追加の句がいくつかあります。LIMIT:クエリによって戻される結果の数を制限します。BY:指定した列に基づいて結果を並べ替えます。BY:指定した列で結果をグループ化します。HAVING:結果の数に基づいて追加の条件を与えます。テーブルの結合これまでは、一度に1つのテーブルしか操作していませんでしたが、実際には多くのデータベースが、何らかの方法で相互に関連する複数のテーブルで構成されています。フライトの例では、都市に合わせて空港コードを追加するとします。現在のテーブルの設定では、各行に2つの列を追加する必要があります。都市XがコードYに関連付けられていることを複数の場所に記述する必要があるため、情報を繰り返す必要があります。この問題を解決する1つの方法は、フライトを記録するテーブルと、空港を記録するテーブルを作成することです。2番目のテーブルは次のようになります。これで、コードと都市を関連づけるテーブルができました。保存できれば、ストレージスペースを節約できます。そのため、フライトテーブルを書き換える必要があります。列を指定しているため、これらの値を外部キーと呼びます。航空会社は、フライトや空港だけでなく、各乗客がどのフライトに搭乗するかなど、乗客に関するデータを保存することもできます。リレーショナル・データベースの機能を使用して、姓と名を格納する別のテーブルと、それらが実行されているフライトを表す外部キーを追加できます。同じ人が複数のフライトに乗っているかもしれないので、もう一工夫するべきでしょう。テーブルを作成できます。関係を多対多の関係と呼びます。テーブルは、関連テーブルと呼ばれます。JOINクエリデータはより効率的に保存されるようになりましたが、データを照会するのはより困難なようです。ありがたいことに、SQLにはJOINクエリがあり、別のクエリのために2つのテーブルを結合することができます。テーブルを使用します。このクエリの最初の部分は、すでに親しんでいるものです。フライトテーブルに格納されているため、ここで問題が発生します。対応していることを使用して、2つのテーブルを結合します。JOINと呼ばれる方法を使用しました。JOINなどの他のタイプの結合もあります。ここでは詳しく説明しません。インデックスの作成:大きなテーブルを扱うときにクエリをより効率的にする1つの方法は、テキストの後ろに表示されるインデックスに似たインデックスを作成することです。乗客を苗字で検索することが多いことがわかっている場合は、次のコマンドを使用して、苗字からidまでのインデックスを作成できます。(last);SQLの脆弱性SQLを使用したデータ処理の基本を理解したので、SQLの使用に関連する主な脆弱性を指摘することが重要です。SQLインジェクションから始めます。SQLインジェクション攻撃とは、悪意のあるユーザーがサイトのセキュリティ対策を回避するためにSQLコードを入力することです。ユーザ名とパスワードを格納するテーブルがあり、ページのホームサイトにログインフォームがあるとします。次のようなクエリを使用してユーザーを検索できます。入力し、パスワードとしては何も入力しません。コメントを表し、クエリは次のようになります。"12345";このクエリではパスワードチェックがコメント化されているため、ハッカーはパスワードを知らなくてもHarryのアカウントにログインできます。この問題を解決するには、次の方法があります。エスケープ文字は、SQLが入力をSQLコードではなくプレーン・テキストとして扱うようにするために使用します。独自のエスケープシーケンスを含むSQL上の抽象レイヤなので、自分でSQLクエリを記述する必要はありません。SQLに関するもう1つの主な脆弱性は、競合状態として知られています。競合状態とは、データベースに対する複数のクエリが同時に発生する状況です。これらが適切に処理されないと、データベースが更新される正確な時間に問題が発生する可能性があります。銀行口座に150ドルあるとします。スマートフォンとラップトップPCの両方で自分の銀行口座にログインし、各デバイスで$100を引き出そうとすると、競合状態が発生する可能性があります。銀行のソフトウェア開発者が競合条件に正しく対処していなければ、150ドルしか入っていない口座から200ドルを引き出すことができるかもしれません。この問題を解決する1つの方法は、データベースをロックすることです。1つのトランザクションが完了するまで、データベースとの他の対話を許可できませんでした。銀行の例では、私のコンピュータの「引き出しをする」ページに移動するためにクリックした後、銀行は私のスマートフォンからそのページに移動することを許可しないかもしれません。したもので、直接SQLクエリを使うのではなく、Pythonのクラスやオブジェクトを使ってデータベースを操作することができます。航空会社用のdjangoプロジェクトを作成し、そのプロジェクト内にアプリケーションを作成して、モデルの使用を開始しましょう。flights次に、通常どおりにアプリケーションを追加する手順を実行します。