Python - MySQL データベースへのアクセス
前のページ次のページ
データベース インターフェイスの Python 標準は、Python DB-API です。ほとんどの Python データベース インターフェイスは、この標準に準拠しています。
アプリケーションに適したデータベースを選択できます。 Python Database API は、次のような幅広いデータベース サーバーをサポートします −
- GadFly
- mSQL
- MySQL
- PostgreSQL
- Microsoft SQL Server 2000
- Informix
- インターベース
- オラクル
- Sybase
利用可能な Python データベース インターフェースのリストは次のとおりです:Python データベース インターフェースと API。アクセスする必要があるデータベースごとに個別の DB API モジュールをダウンロードする必要があります。たとえば、Oracle データベースと MySQL データベースにアクセスする必要がある場合は、Oracle と MySQL データベース モジュールの両方をダウンロードする必要があります。
DB API は、可能な限り Python の構造と構文を使用してデータベースを操作するための最小限の標準を提供します。この API には以下が含まれます −
- API モジュールのインポート
- データベースとの接続を取得します。
- SQL ステートメントとストアド プロシージャの発行
- 接続を閉じる
MySQL を使用してすべての概念を学習するので、MySQLdb モジュールについて話しましょう。
MySQLdb とは?
MySQLdb は、Python から MySQL データベース サーバーに接続するためのインターフェイスです。 Python Database API v2.0 を実装し、MySQL C API の上に構築されています。
MySQLdb のインストール方法
先に進む前に、マシンに MySQLdb がインストールされていることを確認してください。 Pythonスクリプトに次のように入力して実行するだけです-
#!/usr/bin/python import MySQLdb
次の結果が生成される場合、MySQLdb モジュールがインストールされていないことを意味します −
Traceback (most recent call last): File "test.py", line 3, in <module> import MySQLdb ImportError: No module named MySQLdb
MySQLdb モジュールをインストールするには、次のコマンドを使用します −
For Ubuntu, use the following command - $ sudo apt-get install python-pip python-dev libmysqlclient-dev For Fedora, use the following command - $ sudo dnf install python python-devel mysql-devel redhat-rpm-config gcc For Python command prompt, use the following command - pip install MySQL-python
注意 − 上記のモジュールをインストールするには、root 権限があることを確認してください。
データベース接続
MySQL データベースに接続する前に、次のことを確認してください −
-
データベース TESTDB を作成しました。
-
TESTDB にテーブル EMPLOYEE を作成しました。
-
このテーブルには、FIRST_NAME、LAST_NAME、AGE、SEX、および INCOME フィールドがあります。
-
TESTDBにアクセスするためのユーザーID「testuser」とパスワード「test123」が設定されています。
-
Python モジュール MySQLdb がマシンに正しくインストールされています。
-
MySQL チュートリアルを完了して、MySQL の基本を理解しました。
例
以下はMySQLデータベース「TESTDB」との接続例です
#!/usr/bin/python import MySQLdb # Open database connection db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # prepare a cursor object using cursor() method cursor = db.cursor() # execute SQL query using execute() method. cursor.execute("SELECT VERSION()") # Fetch a single row using fetchone() method. data = cursor.fetchone() print "Database version : %s " % data # disconnect from server db.close()
このスクリプトを実行すると、Linux マシンで次の結果が生成されます。
Database version : 5.0.45
データソースとの接続が確立されると、接続オブジェクトが返され、db に保存されます。 それ以外の場合は db なしに設定されています。次に、データベース オブジェクトはカーソルの作成に使用されます このオブジェクトは、SQL クエリの実行に使用されます。最後に、出てくる前に、データベース接続が閉じられ、リソースが解放されていることを確認します。
データベース テーブルを作成しています
データベース接続が確立されると、execute を使用してデータベース テーブルにテーブルまたはレコードを作成する準備が整います。 作成されたカーソルのメソッド。
例
データベーステーブル EMPLOYEE を作成しましょう −
#!/usr/bin/python import MySQLdb # Open database connection db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # prepare a cursor object using cursor() method cursor = db.cursor() # Drop table if it already exist using execute() method. cursor.execute("DROP TABLE IF EXISTS EMPLOYEE") # Create table as per requirement sql = """CREATE TABLE EMPLOYEE ( FIRST_NAME CHAR(20) NOT NULL, LAST_NAME CHAR(20), AGE INT, SEX CHAR(1), INCOME FLOAT )""" cursor.execute(sql) # disconnect from server db.close()
INSERT 操作
レコードをデータベース テーブルに作成する場合に必要です。
例
次の例では、SQL INSERT を実行します。 EMPLOYEE テーブルにレコードを作成するステートメント −
#!/usr/bin/python import MySQLdb # Open database connection db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # prepare a cursor object using cursor() method cursor = db.cursor() # Prepare SQL query to INSERT a record into the database. sql = """INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME) VALUES ('Mac', 'Mohan', 20, 'M', 2000)""" try: # Execute the SQL command cursor.execute(sql) # Commit your changes in the database db.commit() except: # Rollback in case there is any error db.rollback() # disconnect from server db.close()
上記の例は、SQL クエリを動的に作成するために次のように記述できます −
#!/usr/bin/python import MySQLdb # Open database connection db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # prepare a cursor object using cursor() method cursor = db.cursor() # Prepare SQL query to INSERT a record into the database. sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \ LAST_NAME, AGE, SEX, INCOME) \ VALUES ('%s', '%s', '%d', '%c', '%d' )" % \ ('Mac', 'Mohan', 20, 'M', 2000) try: # Execute the SQL command cursor.execute(sql) # Commit your changes in the database db.commit() except: # Rollback in case there is any error db.rollback() # disconnect from server db.close()
例
次のコード セグメントは、パラメーターを直接渡すことができる別の実行形式です −
.................................. user_id = "test123" password = "password" con.execute('insert into Login values("%s", "%s")' % \ (user_id, password)) ..................................
読み取り操作
データベースに対する READ 操作は、データベースから有用な情報を取得することを意味します。
データベース接続が確立されると、このデータベースにクエリを実行する準備が整います。 fetchone() のいずれかを使用できます 単一のレコードを取得するメソッドまたは fetchall() データベース テーブルから複数の値をフェッチするメソッド。
-
fetchone() − クエリ結果セットの次の行をフェッチします。結果セットは、テーブルのクエリにカーソル オブジェクトが使用されたときに返されるオブジェクトです。
-
fetchall() - 結果セットのすべての行をフェッチします。結果セットからすでにいくつかの行が抽出されている場合、結果セットから残りの行を取得します。
-
行数 − これは読み取り専用の属性で、execute() メソッドによって影響を受けた行数を返します。
例
次の手順では、給与が 1000 を超える EMPLOYEE テーブルのすべてのレコードをクエリします −
#!/usr/bin/python import MySQLdb # Open database connection db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # prepare a cursor object using cursor() method cursor = db.cursor() sql = "SELECT * FROM EMPLOYEE \ WHERE INCOME > '%d'" % (1000) try: # Execute the SQL command cursor.execute(sql) # Fetch all the rows in a list of lists. results = cursor.fetchall() for row in results: fname = row[0] lname = row[1] age = row[2] sex = row[3] income = row[4] # Now print fetched result print "fname=%s,lname=%s,age=%d,sex=%s,income=%d" % \ (fname, lname, age, sex, income ) except: print "Error: unable to fecth data" # disconnect from server db.close()
これにより、次の結果が生成されます-
fname=Mac, lname=Mohan, age=20, sex=M, income=2000
更新操作
UPDATE 任意のデータベースでの操作は、データベースで既に使用可能な 1 つまたは複数のレコードを更新することを意味します。
次の手順では、SEX が 'M' であるすべてのレコードを更新します。 .ここでは、すべての男性の AGE を 1 年増やします。
例
#!/usr/bin/python import MySQLdb # Open database connection db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # prepare a cursor object using cursor() method cursor = db.cursor() # Prepare SQL query to UPDATE required records sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M') try: # Execute the SQL command cursor.execute(sql) # Commit your changes in the database db.commit() except: # Rollback in case there is any error db.rollback() # disconnect from server db.close()
削除操作
データベースからいくつかのレコードを削除する場合は、DELETE 操作が必要です。以下は、AGEが20以上のEMPLOYEEからすべてのレコードを削除する手順です −
例
#!/usr/bin/python import MySQLdb # Open database connection db = MySQLdb.connect("localhost","testuser","test123","TESTDB" ) # prepare a cursor object using cursor() method cursor = db.cursor() # Prepare SQL query to DELETE required records sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20) try: # Execute the SQL command cursor.execute(sql) # Commit your changes in the database db.commit() except: # Rollback in case there is any error db.rollback() # disconnect from server db.close()
取引の実行
トランザクションは、データの一貫性を保証するメカニズムです。トランザクションには次の 4 つのプロパティがあります −
-
原子性 − トランザクションが完了するか、何も起こらないかのどちらかです。
-
一貫性 − トランザクションは一貫した状態で開始し、システムを一貫した状態のままにする必要があります。
-
隔離 − トランザクションの中間結果は、現在のトランザクションの外では見えません。
-
耐久性 − トランザクションがコミットされると、システム障害の後でもその効果は持続します。
Python DB API 2.0 には、commit するための 2 つのメソッドが用意されています。 またはロールバック
例
トランザクションの実装方法はすでに知っています。これも同様の例です-
# Prepare SQL query to DELETE required records sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20) try: # Execute the SQL command cursor.execute(sql) # Commit your changes in the database db.commit() except: # Rollback in case there is any error db.rollback()
コミット操作
コミットは、変更を確定するためにデータベースに青信号を与える操作です。この操作の後、変更を元に戻すことはできません。
commit を呼び出す簡単な例を次に示します。 メソッド。
db.commit()
ロールバック操作
1 つまたは複数の変更に満足できず、それらの変更を完全に元に戻したい場合は、rollback() を使用します メソッド。
rollback() を呼び出す簡単な例を次に示します。 メソッド。
db.rollback()
データベースを切断しています
データベース接続を切断するには、close() メソッドを使用してください。
db.close()
ユーザーが close() メソッドを使用してデータベースへの接続を閉じた場合、未処理のトランザクションは DB によってロールバックされます。ただし、DB の下位レベルの実装の詳細に依存するのではなく、コミットまたはロールバックを明示的に呼び出したほうがよいでしょう。
エラーの処理
エラーの原因はたくさんあります。いくつかの例としては、実行された SQL ステートメントの構文エラー、接続エラー、またはキャンセル済みまたは終了済みのステートメント ハンドルに対する fetch メソッドの呼び出しがあります。
DB API は、各データベース モジュールに存在しなければならないエラーの数を定義します。次の表に、これらの例外を示します。
Sr.No. | 例外と説明 |
---|---|
1 | 警告 致命的でない問題に使用されます。 StandardError をサブクラス化する必要があります。 |
2 | エラー エラーの基本クラス。 StandardError をサブクラス化する必要があります。 |
3 | インターフェースエラー データベース自体ではなく、データベース モジュールのエラーに使用されます。 Error をサブクラス化する必要があります。 |
4 | データベースエラー データベースのエラーに使用されます。 Error をサブクラス化する必要があります。 |
5 | データエラー データ内のエラーを参照する DatabaseError のサブクラス。 |
6 | 操作上のエラー データベースへの接続が失われたなどのエラーを参照する DatabaseError のサブクラス。これらのエラーは通常、Python スクリプト作成者の制御の範囲外です。 |
7 | 整合性エラー 一意性制約や外部キーなど、リレーショナルの整合性を損なう状況の DatabaseError のサブクラス。 |
8 | 内部エラー カーソルがアクティブでなくなったなど、データベース モジュール内部のエラーを参照する DatabaseError のサブクラス。 |
9 | プログラミングエラー 不適切なテーブル名などのエラーを参照する DatabaseError のサブクラスで、安全にユーザーの責任にできる可能性があります。 |
10 | NotSupportedError サポートされていない機能を呼び出そうとしていることを示す DatabaseError のサブクラスです。 |
Python スクリプトはこれらのエラーを処理する必要がありますが、上記の例外を使用する前に、MySQLdb がその例外をサポートしていることを確認してください。 DB API 2.0 仕様を読むことで、それらについての詳細を得ることができます。
Python