Latest web development tutorials

python3のMySQLデータベース接続

本稿では、のpython3の使用紹介PyMySQLは 、データベース、および単純なCRUDに接続します。

PyMySQLとは何ですか?

使用のMySQLdbでPython3.x、Python2でデータベース接続MySQLサーバのバージョンのためのPyMySQL。

PyMySQLは、PythonデータベースAPI v2.0仕様に従うと、純粋なPythonのMySQLクライアントライブラリが含まれています。


PyMySQLインストール

PyMySQLを使用する前に、我々はPyMySQLがインストールを確認する必要があります。

PyMySQLダウンロードします。https://github.com/PyMySQL/PyMySQL。

まだインストールされていない場合、我々はPyMySQLの最新バージョンをインストールするには、次のコマンドを使用することができます。

$ pip install PyMySQL

お使いのシステムは、ピップコマンドをサポートしていない場合は、次のインストールを使用することができます。

(あなたも手動でダウンロードすることができます)インストールパッケージをダウンロードするにはgitのコマンドを使用して、1、:

$ git clone https://github.com/PyMySQL/PyMySQL
$ cd PyMySQL/
$ python3 setup.py install

あなたはバージョン番号を開発する必要がある場合は2、、インストールするcurlコマンドを使用することができます。

$ # X.X 为 PyMySQL 的版本号
$ curl -L https://github.com/PyMySQL/PyMySQL/tarball/pymysql-X.X | tar xz
$ cd PyMySQL*
$ python3 setup.py install
$ # 现在你可以删除 PyMySQL* 目录

注:上記のモジュールをインストールするには、root権限を持っていることを確認します。

あなたがsetuptoolsのインストールする必要がないことを意味し、エラーメッセージ、あなたがアクセスすることができます。インストールプロセスが「いいえモジュールsetuptoolsの名前のないはImportError」が表示されることがありhttps://pypi.python.org/pypi/setuptoolsを各システムのインストール方法を見つけます。

Linuxのインストール例:

$ wget https://bootstrap.pypa.io/ez_setup.py
$ python3 ez_setup.py

データベース接続

データベースに接続する前に、以下の項目を確認してください。

  • あなたは、データベースTESTDBを作成しました。
  • TESTDBデータベースでは、表EMPLOYEEを作成しました
  • EMPLOYEEテーブルのフィールドFIRST_NAME、LAST_NAME、年齢、性別、所得。
  • ユーザーは、あなたがあなた自身の直接またはrootユーザー名とパスワードを設定することができ、「test123」を「TESTUSER」という名前TESTDB、パスワードを使用してデータベースに接続し、MySQLのデータベース・ユーザー・ライセンスは、GRANTコマンドを使用してください。
  • ご使用のマシンにすでにパイソンのMySQLdbモジュールをインストールしました。
  • あなたは、SQL文に精通していない場合、あなたは私達の訪問することができますSQLチュートリアルの基礎を

例:

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

#!/usr/bin/python3

import pymysql

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

# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()

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

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

print ("Database version : %s " % data)

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

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

Database version : 5.5.20-log

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

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

#!/usr/bin/python3

import pymysql

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

# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()

# 使用 execute() 方法执行 SQL,如果表存在则删除
cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")

# 使用预处理语句创建表
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/python3

import pymysql

# 打开数据库连接
db = pymysql.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:
   # 如果发生错误则回滚
   db.rollback()

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

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

#!/usr/bin/python3

import pymysql

# 打开数据库连接
db = pymysql.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)
   # 执行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/python3

import pymysql

# 打开数据库连接
db = pymysql.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/python3

import pymysql

# 打开数据库连接
db = pymysql.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/python3

import pymysql

# 打开数据库连接
db = pymysql.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のサブクラスでなければなりません。