はじめに
このチュートリアルでは、Pythonのsqlite3インターフェイスと組み合わせてSQLiteを使用することについて説明します。 SQLiteが単一のファイルのリレーショナルデータベースの束がほとんどの標準のPython設. SQLiteは、多くの場合、小さなアプリケーション、特に携帯電話やタブレット、スマートアプライアンス、計測器などの組み込みシステムやデバイスに最適な技術 しかし、しているところも少なくないので使っている中小webトパッケージです。,
データベースの作成と接続
新しいSQLiteデータベースの作成は、Python標準ライブラリのsqlite3モジュールを使用して接続を作成するのと同じくらい簡単です。 接続を確立するには、sqlite3モジュールのconnect(...)
メソッドにファイルパスを渡すだけで、ファイルによって表されるデータベースが存在しな,
import sqlite3con = sqlite3.connect('/path/to/file/db.sqlite3')
日常のデータベースプログラミングでは、データベースへの接続を常に作成していることがわかりますので、この単純な接続ステートメントを再利用可能な一般化関数にラップすることをお勧めします。
テーブルの作成
データベーステーブルを作成するには、格納するデータの構造を知っておく必要があります。 リレーショナルデータベースのテーブルを定義する際には、多くの設計上の考慮事項があります。, 私はこの練習の詳細に入ることはありませんし、代わりにさらに調査するために読者にそれを残します。
ただし、Pythonを使用したSQLiteデータベースプログラミングの議論を支援するために、本の販売に関して以下のデータが既に収集されている架空の書店のためにデータベースを作成する必要があるという前提を下回っています。,
customer | date | product | price |
---|---|---|---|
Alan Turing | 2/22/1944 | Introduction to Combinatorics | 7.99 |
Donald Knuth | 7/3/1967 | A Guide to Writing Short Stories | 17.99 |
Donald Knuth | 7/3/1967 | Data Structures and Algorithms | 11.99 |
Edgar Codd | 1/12/1969 | Advanced Set Theory | 16.,99 |
このデータを検査すると、顧客、製品、および注文に関する情報が含まれていることが明らかです。 このタイプのトランザクションシステムのデータベース設計における一般的なパターンは、注文を注文と広告申込情報(注文詳細と呼ばれることもありま
Pythonインタプリタでは、db_utilsと同じディレクトリにあります。,前に定義されたpyモジュールは、次の顧客と製品のテーブルを作成するためのSQLを入力します。
上記のコードは、接続オブジェクトを作成し、カーソルオブジ カーソルオブジェクトを実行するために利用SQLステートメントはSQLiteデータベースです。カーソルを作成してsqlを作成し、customersテーブルを作成し、first and last nameテキストフィールドとともに主キーを与え、それをcustomers_sql
という変数に割り当てます。, 次に、カーソルオブジェクトのexecute(...)
メソッドを呼び出し、customers_sql
変数を渡します。 次に、同様の方法でproductsテーブルを作成します。
組み込みSQLiteメタデータテーブルであるsqlite_master
テーブルをクエリして、上記のコマンドが成功したことを確認できます。
現在接続されているデータベースクエリ内のすべてのテーブルを表示するには、name
sqlite_master
テーブルの列type
が”table”と等しい,
テーブルのスキーマを見るには、sql
同じテーブルの列type
はまだ”table”であり、name
は”customers”および/または”products”に等しい。
次に定義するテーブルは、外部キーと購入日を介して顧客を注文に関連付けるordersテーブルになります。 SQLiteは実際の日付/時刻データ型(またはSQLiteの方言と一致するデータクラス)をサポートしていないため、すべての日付はテキスト値として表されます。,
定義する最後のテーブルは、各注文の製品の詳細な会計を提供する明細テーブルになります。
データのロード
このセクションでは、作成したばかりのテーブルにサンプルデータを挿入する方法を示します。 なぜなら、productsなしでは販売を行うことができず、広告申込情報と注文に関連する外部キーがないからです。, データベースに接続します。
この一般的な概要を考えると、次のように書きましょう。もう少しコード。,
上記のコードはおそらくかなり明白なようですが、ここで重要なことがいくつかあるので、少し議論しましょう。 Insertステートメントは、?
ビットを除いて、標準SQL構文に従います。 Div id=”16f5484de9″>
は、実際には”パラメータ化されたクエリ”と呼ばれるもののプレースホルダです。
パラメータ化されたクエリは、Pythonのsqlite3モジュールなどの最新の高レベルプログラミング言語への基本的にすべてのデータベースインターフェイスの重要, このタイプのクエリは、数回繰り返されるクエリの効率を向上させるのに役立ちます。 おそらくより重要なのは、sqlインジェクションにつながる悪意のある入力を防ぐために、cursorオブジェクトのexecuteメソッドの呼び出し中に渡される?
プレースホルダーの代わりに入力をサニタイズすることです。 以下は、人気のある漫画ですxkcd.com SQLインジェクションの危険性を説明するブログ。
残りのテーブルを移入するために、わずかに異なるパターンに従って物事を少し変更します。, 顧客の姓と購入日の組み合わせによって識別される各注文のワークフローは、次のようになります。
- 新しい顧客をcustomersテーブルに挿入し、その主キー idを取得
- 顧客idと購入日に基づいて注文エントリを作成し、その主キー idを取得します。
- 注文内の各製品について、主キー idを決定し、注文と商品を関連付ける広告申込情報エントリを作成します。
自分で物事を簡単にするために、私たちは簡単に行うことができます。すべての当社の製品のルックアップ。, 今のところ、SELECT SQLステートメントの仕組みについてあまり心配しないでください。
最初の注文はFeb22、1944にアラン-チューリングによって7.99ドルで組み合わせ論の紹介を購入しました。
まず、Turing氏の新しい顧客レコードを作成し、cursorオブジェクトのlastrowid
フィールドにアクセスして主キー idを決定します。
これで、注文エントリを作成し、新しい注文id値を収集し、Mr.Turingが注文した製品と一緒に広告申込情報エントリに関連付けることができます。,
残りのレコードは、Donald Knuthに対して行われた注文を除いて、まったく同じようにロードされます。 しかし、そのようなタスクの反復的な性質は、これらの機能を再利用可能な機能にラップする必要性を叫んでいます。 では、db_utils.py モジュールは、次のコードを追加します:
ああ、今、我々はいくつかの効率で動作することができます!
あなたはする必要がありますexit()
あなたのPythonインタプリタとインタプリタでアクセスできるようになるためにあなたの新しい関数を得るためにそれをリロードします。,
私はソフトウェアの職人技の学生としてアドバイスの一つの追加の部分を与えることを余儀なくされた感じ。 複数のデータベース操作(この場合は挿入)を行って、実際には一つの累積タスク(注文の作成)を達成する場合は、サブタスク(顧客、注文、広告申込情報の作成)を,
これは次のようになります。
このセクションでは、データベース内の既存のレコードを更新する方法の簡単なデモンストレーションを終了します。 短編小説の価格を10.99(発売中)に書くためのガイドを更新しましょう。
>>> update_sql = "UPDATE products SET price = ? WHERE id = ?">>> cur.execute(update_sql, (10.99, 2))
データベースのクエリ
一般的に、データベースで実行される最も一般的なアクションは、SELECTステートメントを介してデータベースに格納されているデータ このセクションでは、sqlite3インターフェイスを使用して単純なSELECTクエリを実行する方法を説明します。,customersテーブルの基本的なmultirowクエリを実行するには、カーソルオブジェクトのexecute(...)
メソッドにSELECTステートメントを渡します。 この後、同じcursorオブジェクトのfetchall()
メソッドを呼び出すことで、クエリの結果を反復処理できます。
代わりに、データベースから一つのレコードを取得したいとしましょう。 これを行うには、Donald Knuthのidが2の場合など、より具体的なクエリを記述し、cursorオブジェクトのfetchone()
メソッドを呼び出してそれを追,
>>> cur.execute("SELECT id, first_name, last_name FROM customers WHERE id = 2")>>> result = cur.fetchone()>>> print(result)(2, 'Donald', 'Knuth')
各結果の個々の行がタプルの形でどのようになっているかを確認してください? まあ、タプルはいくつかのプログラミングのユースケースでは非常に便利なPythonicデータ構造ですが、多くの人々はデータ検索のタスクに関して少し妨げている おそらく一部の人にとってより柔軟な方法でデータを表現する方法があるということは、たまたま起こります。 あなたがする必要があるのは、connectionオブジェクトのrow_factory
メソッドをsqlite3.Row
のようなより適切なものに設定するだけです。, これにより、位置またはキーワード値によって行の個々の項目にアクセスすることができます。
結論
この記事では、ほとんどのPythonインストールに事前にバンドルされている軽量な単一ファイルSQLiteデータベースへのsqlite3Pythonインターフェイスの最も重要な機能と機能であると感じることを簡単にデモンストレーションしました。, 私はまた、データベースプログラミングに関するベストプラクティスに関するアドバイスをいくつか与えようとしましたが、データベースプログラミングの複雑