Latest web development tutorials

Pythonの操作MySQLデータベース

PythonのDB-APIのPythonの標準データベースインタフェースは、PythonのDB-APIは、開発者のためのデータベース・アプリケーション・プログラミング・インターフェースを提供します。

Pythonのデータベースインタフェースを使用すると、データベースプロジェクトを選択することができ、非常に大規模なデータベースをサポートしています。

  • あぶ
  • mSQLの
  • MySQLの
  • PostgreSQLの
  • Microsoft SQL Serverの2000
  • Informixの
  • Interbaseの
  • オラクル
  • Sybaseの

あなたがアクセスできるPythonのデータベースインタフェースとAPIがサポートされているデータベースの詳細なリストを参照してください。

あなたが別のDB APIモジュールをダウンロードする必要があります別のデータベースは、例えば、あなたがOracleとMySQLのデータベースモジュールをダウンロードする必要があり、OracleデータベースおよびMySQLのデータにアクセスする必要があります。

DB-APIは、オブジェクトのセットを定義し、データベースは、基礎となるデータベース・システムおよびデータベース・インターフェース・プログラムの種々の広範囲にアクセスするための一貫性のあるインタフェースを提供するために、モードにアクセスしなければならない仕様です。

PythonのDB-APIデータベースのほとんどは、インターフェイスを実装するために、あなたは同じようにそれぞれのデータベースを使用することができ、データベースを接続した後、それを使用しています。

プロセスを使ってPython DB-API:

  • APIモジュールの導入。
  • データベースに接続して取得。
  • SQLステートメントおよびストアドプロシージャを実行します。
  • データベース接続を閉じます。

MySQLdbは何ですか?

MySQLdbは、MySQLのC APIの確立に基づいて、PythonのデータベースAPI仕様V2.0を実装するPythonのMySQLのデータベース・リンク、ためのインタフェースです。


MySQLdbのインストール方法?

DB-APIを使用したMySQLのスクリプトを作成するには、MySQLをインストールしていることを確認する必要があります。 以下のコードをコピーし、それを実行します。

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import MySQLdb

あなたはMySQLdbはモジュールがインストールされていないことを意味実行、後に次のように出力された場合:

Traceback (most recent call last):
  File "test.py", line 3, in <module>
    import MySQLdb
ImportError: No module named MySQLdb

MySQLdbをインストールし、訪問http://sourceforge.net/projects/mysql-pythonを 、(Linuxプラットフォームにアクセスすることができます。 https://pypi.python.org/pypi/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、年齢、性別、所得。
  • ユーザーは、あなたがあなた自身の直接またはrootユーザー名とパスワードを設定することができ、「test123」を「TESTUSER」という名前TESTDB、パスワードを使用してデータベースに接続し、MySQLのデータベース・ユーザー・ライセンスは、GRANTコマンドを使用してください。
  • ご使用のマシンにすでにパイソンのMySQLdbモジュールをインストールしました。
  • あなたは、SQL文に精通していない場合、あなたは私達の訪問することができますSQLチュートリアルの基礎を

例:

TESTDB MySQLのデータベース・リンクの例を示します。

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import MySQLdb

# 打开数据库连接
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

# 使用cursor()方法获取操作游标 
cursor = db.cursor()

# 使用execute方法执行SQL语句
cursor.execute("SELECT VERSION()")

# 使用 fetchone() 方法获取一条数据库。
data = cursor.fetchone()

print "Database version : %s " % data

# 关闭数据库连接
db.close()

上記のスクリプトの実装は次のように結果が出力されます。

Database version : 5.0.45

データベーステーブルを作成します。

データベース接続が存在する場合、我々は、データベースのテーブルを作成するには、以下に示す表EMPLOYEEを作成するためにexecute()メソッドを使用することができます。

#!/usr/bin/python
# -*- coding: UTF-8 -*-

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()

データベースの挿入

次の例では、表EMPLOYEEにレコードを挿入するSQLのINSERT文を実行使用します。

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import MySQLdb

# 打开数据库连接
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

# 使用cursor()方法获取操作游标 
cursor = db.cursor()

# SQL 插入语句
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
         LAST_NAME, AGE, SEX, INCOME)
         VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
try:
   # 执行sql语句
   cursor.execute(sql)
   # 提交到数据库执行
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()

# 关闭数据库连接
db.close()

次のように上記の例にも書くことができます。

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import MySQLdb

# 打开数据库连接
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

# 使用cursor()方法获取操作游标 
cursor = db.cursor()

# SQL 插入语句
sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \
       LAST_NAME, AGE, SEX, INCOME) \
       VALUES ('%s', '%s', '%d', '%c', '%d' )" % \
       ('Mac', 'Mohan', 20, 'M', 2000)
try:
   # 执行sql语句
   cursor.execute(sql)
   # 提交到数据库执行
   db.commit()
except:
   # 发生错误时回滚
   db.rollback()

# 关闭数据库连接
db.close()

例:

次のコードは、SQL文にパラメータを渡すために変数を使用します。

..................................
user_id = "test123"
password = "password"

con.execute('insert into Login values("%s", "%s")' % \
             (user_id, password))
..................................

データベースクエリ

複数のデータを取得するためにはfetchAll()メソッドを使用して単一のデータを取得するfetchone()メソッドを使用して、PythonのMySQLクエリー。

  • fetchone():このメソッドは、次のクエリの結果セットを取得します。結果セットは、ターゲットであります
  • fetchAllのは():すべての行を受信するために結果を返します。
  • ROWCOUNT:これは読み取り専用の属性で、影響を受けた行数の後に実行がexecute()メソッドを返します。

例:

ディスカバーEMPLOYEE表の給与(賃金)のデータフィールドは、1000年のすべてよりも大きいです。

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import MySQLdb

# 打开数据库连接
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

# 使用cursor()方法获取操作游标 
cursor = db.cursor()

# SQL 查询语句
sql = "SELECT * FROM EMPLOYEE \
       WHERE INCOME > '%d'" % (1000)
try:
   # 执行SQL语句
   cursor.execute(sql)
   # 获取所有记录列表
   results = cursor.fetchall()
   for row in results:
      fname = row[0]
      lname = row[1]
      age = row[2]
      sex = row[3]
      income = row[4]
      # 打印结果
      print "fname=%s,lname=%s,age=%d,sex=%s,income=%d" % \
             (fname, lname, age, sex, income )
except:
   print "Error: unable to fecth data"

# 关闭数据库连接
db.close()

次のように上記のスクリプトの実行結果は以下のとおりです。

fname=Mac, lname=Mohan, age=20, sex=M, income=2000

データベースの更新

データ・テーブルを更新するためのデータ更新操作は、以下の例は、テーブルSEXフィールドに 'M'に対するすべての変更をTESTDBます、AGEフィールドが1つインクリメントされます。

#!/usr/bin/python
# -*- coding: UTF-8 -*-

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()
except:
   # 发生错误时回滚
   db.rollback()

# 关闭数据库连接
db.close()

削除

データがテーブルのデータを削除する削除し、次の例では、表EMPLOYEEのAGEに削除データを示している20以上である、データのすべて:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import MySQLdb

# 打开数据库连接
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

# 使用cursor()方法获取操作游标 
cursor = db.cursor()

# SQL 删除语句
sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)
try:
   # 执行SQL语句
   cursor.execute(sql)
   # 提交修改
   db.commit()
except:
   # 发生错误时回滚
   db.rollback()

# 关闭连接
db.close()

エグゼクティブ総務

データの一貫性を確保するために、トランザクション機構。

原子性、一貫性、独立性、耐久性:サービスは4つのプロパティを持つ必要があります。 これらの4つのプロパティは、多くの場合、ACID特性と呼ばれています。

  • アトミック(原子)。 トランザクションは作業の分割単位は、このような操作がトランザクションに含まれるいずれかで行うか行わないされています。
  • 一貫性(整合性)。 サービスは別の一貫した状態にある一貫した状態からデータベースを作るために変更する必要があります。 一貫性と不可分性は密接に関連しています。
  • アイソレーション(絶縁)。 他のトランザクション干渉することはできませんトランザクションを実行します。 つまり、他のデータトランザクションの同時実行の内部動作及​​び使用が単離され、同時に実行個々の取引の間に互いに干渉することはできませんトランザクションです。
  • 持続性(耐久性)。 永続的にも永久(耐久)と呼ばれる永続的である必要があり、それはトランザクションがコミットされると、データベース内のデータを変更することを意味します。 以下の他の操作またはその故障はどんな影響を与えるべきではありません。

PythonのDBのAPI 2.0は、トランザクションの2つの方法がコミットまたはロールバック提供します。

例:

# SQL删除记录语句
sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)
try:
   # 执行SQL语句
   cursor.execute(sql)
   # 向数据库提交
   db.commit()
except:
   # 发生错误时回滚
   db.rollback()

カーソルが確立されているトランザクションデータベース、Pythonでデータベースプログラミングについては、自動的に目に見えないデータベーストランザクションを開始します。

現在のカーソルのすべての操作をロールバックするすべての更新カーソル、ロールバック()メソッドのcommit()メソッドを。 各メソッドは、新たなビジネスを開始しました。


エラー処理

DB APIには、次の表では、エラーと例外を示し、データベースのいくつかのエラーや異常動作を定義します。

異常な 説明
警告 データを挿入するように切り捨て、およびされているような、トリガする重大な警告がある場合。 それははStandardErrorのサブクラスでなければなりません。
エラー 警告以外の他のすべてのエラークラス。 それははStandardErrorのサブクラスでなければなりません。
InterfaceError データベース・インターフェース・モジュールは、独自のエラー(代わりにエラーデータベース)を有する場合、火災が発生します。 これは、エラーのサブクラスでなければなりません。
DatabaseError トリガーおよびデータベース関連のエラー。 これは、エラーのサブクラスでなければなりません。
DataError ある場合、たとえば、トリガーされたときのデータ処理エラーが発生しました:除算をゼロ誤差により、範囲外のデータなどを。 それはDatabaseErrorのサブクラスでなければなりません。
OperationalError これは、非ユーザ制御を意味するが、エラーがデータベース中に発生しました。 たとえば、次のようになど、誤って切断され、データベース名が見つからない場合、トランザクションが失敗し、メモリ割り当てエラーオペレーションデータベースエラーが発生しました。 それはDatabaseErrorのサブクラスでなければなりません。
IntegrityError このような外部キーチェックが失敗したなどの整合性関連のエラー、。 それはDatabaseErrorのサブクラスでなければなりません。
InternalError このようなカーソル(カーソル)などの内部データベースエラーが、障害トランザクションの同期など、失敗します。 それはDatabaseErrorのサブクラスでなければなりません。
ProgrammingError このようなデータテーブルとして手続きのエラー、(テーブル)というように見つからないか、すでに存在して、SQL文の構文エラー、パラメータのエラー番号、及びません。 それはDatabaseErrorのサブクラスでなければなりません。
NotSupportedError エラーがサポートされていません、そのようなAPIやデータベースなどの機能を使用することを指しサポートしていません。 たとえば、接続オブジェクト()関数に.rollback使用して、データベースはトランザクションをサポートしていないか、またはトランザクションが閉じられています。 それはDatabaseErrorのサブクラスでなければなりません。