Python の標準データベース インターフェイスは Python DB-API であり、開発者にデータベース アプリケーション プログラミング インターフェイスを提供します。
Python データベース インターフェイスは多くのデータベースをサポートしており、プロジェクトに合ったデータベースを選択できます:
GadFly
mSQL
MySQL
PostgreSQL
Microsoft SQL Server
Informix
Interbase
Oracle
Sybase
Python データベース インターフェイスと API にアクセスして、サポートされているデータベースの詳細なリストを表示できます。
データベースごとに異なる DB API モジュールをダウンロードする必要があります。たとえば、Oracle データベースと MySQL データにアクセスする必要がある場合は、Oracle および MySQL データベース モジュールをダウンロードする必要があります。
DB-API は、基礎となるさまざまなデータベース システムおよびさまざまなデータベース インターフェイス プログラムに一貫したアクセス インターフェイスを提供するために必要な一連のオブジェクトとデータベース アクセス方法を定義する仕様です。
Python の DB-API は、ほとんどのデータベースのインターフェイスを実装しています。これを使用して各データベースに接続すると、同じ方法で各データベースを操作できます。
Python DB-API の使用プロセス:
API モジュールを紹介します。
データベースへの接続を取得します。
SQL ステートメントとストアド プロシージャを実行します。
データベース接続を閉じます。
MySQLdb とは何ですか?
MySQLdb は、Python が MySQL データベースに接続するためのインターフェイスであり、Python データベース API 仕様 V2.0 を実装しており、MySQL C API に基づいています。
MySQLdb をインストールする方法?
DB-API を使用して MySQL スクリプトを作成するには、MySQL がインストールされていることを確認する必要があります。次のコードをコピーして実行します:
#!/usr/bin/python
import MySQLdb
実行後の出力が以下の場合は、インストールされていないことを意味しますMySQLdb モジュール :
Traceback (直近の呼び出しは最後):
import MySQLdb
ImportError: MySQLdb という名前のモジュールがありません
MySQLdb をインストールするには、http://sourceforge.net/projects/mysql-python にアクセスしてください。ここから、プリコンパイルされたバイナリ ファイルとソース コード インストール パッケージに分かれている、プラットフォームに適したインストール パッケージを選択できます。
バイナリ ファイル配布バージョンを選択した場合、基本的なインストール プロンプトを表示してインストール プロセスを完了できます。ソース コードからインストールする場合は、MySQLdb ディストリビューションの最上位ディレクトリに変更し、次のコマンドを入力する必要があります:
$ Gunzip MySQL-python-1.2.2.tar.gz
$ tar -xvf MySQL -python-1.2.2.tar
$ cd MySQL-python-1.2.2
$ python setup.py build
$ python setup.py install
注: 必ずご確認ください。上記のモジュールをインストールするための root 権限を持っています。
データベース接続
データベースに接続する前に、次のことを確認してください:
データベース TESTDB を作成しました。
TESTDB データベースに、テーブル EMPLOYEE を作成しました
EMPLOYEE テーブルのフィールドは、FIRST_NAME、LAST_NAME、年齢、性別、収入。
データベース TESTDB への接続に使用するユーザー名は「testuser」、パスワードは「test123」です。自分で設定することも、root ユーザー名とパスワードを直接使用することもできます。MySQL データベースのユーザー認証には、Grant コマンドを使用してください。
Python MySQLdb モジュールがマシンにインストールされました。
SQL ステートメントに慣れていない場合は、基本 SQL チュートリアルを参照してください。
例:
次の例は、Mysql の TESTDB データベースにリンクしています:
#!/usr/bin/python
import MySQLdb
# データベース接続を開きます
db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB" )
# Cursor() メソッドを使用して、操作カーソル
cursor = db.cursor()
# SQL ステートメントを実行するには、execute メソッドを使用します
cursor.execute("SELECT VERSION()")
# fetchone() メソッドを使用して取得しますデータベース。
data =cursor.fetchone()
print "データベースバージョン: %s " % data
# データベース接続を閉じます
db.close()
上記のスクリプトを実行します出力は次のとおりです:
データベースのバージョン: 5.0.45
データベーステーブルの作成
データベース接続が存在する場合は、execute() メソッドを使用してデータベースのテーブルを作成できます。 table EMPLOYEE は次のようになります:
#!/usr/bin/python
import MySQLdb
# データベース接続を開きます
db = MySQLdb.connect("localhost","testuser"," test123","TESTDB")
# 操作カーソルを取得するには、cursor() メソッドを使用します
cursor = db.cursor()
# データテーブルがすでに存在する場合は、execute() メソッドを使用しますテーブルを削除します。
cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")
#データテーブルの作成SQL文
sql = """CREATE TABLE EMPLOYEE (
) FIRST_NAME CHAR(20) NOT NULL,
LAST_NAME CHAR(20 ),
AGE INT,
SEX CHAR(1),
INCOME FLOAT )"""
cursor.execute(sql)
#データベース接続を閉じる
db.close()
データベース挿入操作
次の例では、SQL INSERT ステートメントを使用してテーブル EMPLOYEE にレコードを挿入します。 import MySQLdb
#データベース接続を開く
db = MySQLdb.connect("localhost","testuser","test123","TESTDB")
# 操作カーソルを取得するには、cursor() メソッドを使用します
cursor = db.cursor()
# SQL INSERT ステートメント
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
LAST_NAME, AGE, SEX, INCOME)
VALUES ('Mac', 'Mohan) ', 20, 'M', 200 0)"""
try:
#SQL文を実行
Cursor.execute(sql)
#実行のためにデータベースに送信
#db.commit ()
Except:
# エラーが発生した場合はロールバックします
db.rollback()
# データベース接続を閉じます
db.close()
上記の例は、次の形式でも記述できます:
#!/usr/bin/python
import MySQLdb
# データベース接続を開きます
db = MySQLdb.connect("localhost"," testuser","test123","TESTDB" )
# 操作カーソルを取得するには、cursor() メソッドを使用します
cursor = db.cursor()
#SQL 挿入ステートメント
sql = "INSERT従業員(FIRST_NAME,
LAST_NAME, 年齢, 性別, 収入)
VALUES ( '%s', '%s', ' %d', '%c', '%d' )" %
(' Mac', 'Mohan', 20, 'M', 2000)
try:
# SQL ステートメントを実行します
cursor.execute (sql)
# 実行のためにデータベースに送信します
db.commit( )
以外:
# エラー発生時にロールバックする
db.rollback()
# データベース接続を閉じる
db.close( )
例:
次のコードは変数を使用して SQL ステートメントにパラメータを渡します:
................................................. ...
user_id = "test123"
password = "パスワード"
con.execute('ログイン値に挿入("%s", "%s") ' %
データベース クエリ操作
Python は、fetchone() メソッドを使用して単一のデータを取得し、fetchall() メソッドを使用して複数のデータを取得して Mysql にクエリを実行します。
fetchone(): このメソッドは次のクエリ結果セットを取得します。結果セットはオブジェクトです。
fetchall(): 返されたすべての結果行を受け取ります。
rowcount: これは読み取り専用のプロパティであり、execute() メソッドの実行後に影響を受ける行の数を返します。
例:
EMPLOYEE テーブルの給与フィールドが 1000 より大きいすべてのデータをクエリします:
#!/usr/bin/python
import MySQLdb
# データベース接続を開きます
db = MySQLdb.connect("localhost","testuser","test123","TESTDB")
# 操作カーソルを取得するには、cursor() メソッドを使用します
cursor = db.cursor()
# SQL クエリ ステートメント
sql = "SELECT * FROM EMPLOYEE
結果の行に =cursor.fetchall()
を使用:
[4]
print "エラー: データをフェッチできません"
# データベース接続を閉じます
db .close()
上記のスクリプトの実行結果は次のとおりです:
fname=Mac、lname=Mohan、年齢=20、性別=M、収入=2000
データベース更新操作
次の例では、TESTDB テーブルのすべての SEX フィールドを 1 ずつ増分します。
# !/usr/bin/python
import MySQLdb
# データベース接続を開きます
db = MySQLdb.connect("localhost","testuser","test123" , "TESTDB" )
#操作カーソルを取得するには、cursor() メソッドを使用します。
cursor = db.cursor()
# SQL 更新ステートメント
sql = "UPDATE EMPLOYEE SET AGE = AGE + 1
WHERE SEX = '%c' " % ('M')
try:
#SQL ステートメントを実行
cursor.execute(sql)
#実行のためにデータベースに送信
db.commit()
例外:
# ロールバックエラーが発生しました
db.rollback()
# データベース接続を閉じます
db.close()
トランザクションを実行します
トランザクションメカニズムにより、データの一貫性が保証されます。
トランザクションには、原子性、一貫性、分離性、耐久性という 4 つの属性が必要です。これら 4 つのプロパティは、多くの場合、ACID プロパティと呼ばれます。
原子性。トランザクションは、分割できない作業単位です。トランザクションに含まれるすべての操作が完了するか、まったく完了しません。
一貫性。トランザクションでは、データベースをある整合性状態から別の整合性状態に変更する必要があります。一貫性と原子性は密接に関係しています。
孤立。トランザクションの実行は、他のトランザクションによって干渉されることはできません。つまり、トランザクション内で使用される操作とデータは他の同時トランザクションから分離されており、同時に実行されるトランザクションは相互に干渉できません。
耐久性。永続性とも呼ばれる継続性は、トランザクションがコミットされると、データベース内のデータに対する変更が永続的になることを意味します。後続の操作や障害が影響を与えることはありません。
Python DB API 2.0 トランザクションには、コミットまたはロールバックの 2 つのメソッドが用意されています。
例:
#SQL レコード削除ステートメント
sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)
try:
#SQL ステートメントを実行
カーソル。 execute(sql)
# データベースに送信します
db.commit()
以外:
データベースプログラミングでは、カーソルが作成されると、目に見えないデータベーストランザクションが自動的に開始されます。
commit() メソッドはカーソルに対するすべての更新操作を実行し、rollback() メソッドは現在のカーソルに対するすべての操作をロールバックします。各メソッドは新しいトランザクションを開始します。
エラー処理
DB API は、データベース操作のいくつかのエラーと例外を定義します。次の表に、これらのエラーと例外を示します。挿入されたデータは切り詰められます。 StandardError のサブクラスである必要があります。
エラー 警告を除く他のすべてのエラー タイプ。 StandardError のサブクラスである必要があります。
InterfaceError (データベース内のエラーではなく) データベース インターフェイス モジュール自体でエラーが発生したときにトリガーされます。 Error のサブクラスである必要があります。
DatabaseError データベースに関連するエラーが発生したときにトリガーされます。 Error のサブクラスである必要があります。
DataError ゼロ除算エラー、データ範囲外など、データ処理中にエラーが発生したときにトリガーされます。 DatabaseError のサブクラスである必要があります。
OperationalError は、ユーザーによって制御されないが、データベースの操作中に発生するエラーを指します。たとえば、接続が予期せず切断される、データベース名が見つからない、トランザクション処理の失敗、メモリ割り当てエラーなどは、データベースを操作するときに発生するエラーです。 DatabaseError のサブクラスである必要があります。
IntegrityError 外部キーチェックの失敗など、整合性に関連するエラー。 DatabaseError サブクラスである必要があります。
InternalError カーソル障害、トランザクション同期障害などのデータベースの内部エラー。 DatabaseError サブクラスである必要があります。
ProgrammingError データテーブル(テーブル)が見つからない、またはすでに存在する、SQL ステートメントの構文エラー、パラメータの数が間違っているなどのプログラミング エラー。 DatabaseError のサブクラスである必要があります。
NotSupportedError サポートされていないエラーは、データベースでサポートされていない関数または API の使用を指します。たとえば、.rollback() 関数が接続オブジェクトで使用されていますが、データベースがトランザクションをサポートしていないか、トランザクションが閉じられています。 DatabaseError のサブクラスである必要があります。