Python DB-API が登場する前は、データベース間のアプリケーション インターフェイスは非常に複雑で、実装も異なっていました。プロジェクトでデータベースを置き換える必要がある場合、多くの変更が必要となり、非常に不便です。このような問題を解決するのがPython DB-APIの登場です。この記事では主に、データベースに接続するための DB-API for Python の関連情報を紹介します。
はじめに
MySQL、SQL Server、PostgreSQL、SQLite のいずれであっても、Python でデータベースに接続する場合はカーソルを使用するため、Python DB-API を学習する必要があることは誰もが知っています。
すべての Python データベース インターフェイス プログラムは、Python DB-API 仕様にある程度準拠しています。 DB-API は、基礎となるさまざまなデータベース システムおよびさまざまなデータベース インターフェイス プログラムに一貫したアクセス インターフェイスを提供するために、一連の必要なオブジェクトとデータベース アクセス メソッドを定義します。 DB-API は異なるデータベースに対して一貫したアクセス インターフェイスを提供するため、異なるデータベース間でコードを移植するのが簡単になります。
Pythonデータベース接続プロセス:
connectを使用して接続を作成します
connectメソッドはconnectオブジェクトを生成し、それを通じてデータベースにアクセスします。この規格に準拠するモジュールは connect メソッドを実装します。
connect 関数のパラメータは次のとおりです:
user ユーザー名
password パスワード
host ホスト名
database データベース名
DSN データソース名
データベース接続パラメータは、DSN 文字列の形式で提供できます。例: connect(dsn='host:MYDB',user='root',password=' ')
もちろん、異なるデータベース インターフェイス プログラムでは、たとえば、MySQLdb は、仕様で推奨されているデータベース パラメーターの代わりに db パラメーターを使用して、アクセスするデータベースを示します。
host: データベースのホスト名。デフォルトはローカルホストを使用します
database - データベース名
user - ユーザー名
rollback(): 現在のトランザクションをキャンセルします
cursor(): カーソルオブジェクトを作成します
カーソルを使用して作成しますカーソルオブジェクト
fetchone(): 結果セットを取得します 次の行
fetchall(): 結果セットの残りのすべての行を取得します
connection: このカーソルオブジェクトのデータベース接続を作成します
arraysize :何個レコードは fetchmany() メソッドを使用して一度に取得され、デフォルトは 1 です
lastrowid: PHP の last_inset_id() と同等
その他のメソッド:
nextset(): 次の結果セットに移動します (サポートされている場合)
callproc(func[,args]): ストアド プロシージャを呼び出します
setoutputsizes(sizes[,col]): 大きな列をフェッチするための最大バッファ サイズを設定します
その他の属性:
description: カーソルのアクティビティステータスを返します (7 つの要素を含むタプル) : (name、type_code、display_size、internal_size、precision、scale、null_ok) name と type_cose のみが必要です
rowcount: 作成された行数、または最後のexecute() によって影響を受けた行数
messages: カーソルの後実行される データベースによって返される情報タプル (オプション)
rownumber: 現在の結果セット内でカーソルが存在する行のインデックス (開始行番号は 0)
DB のエラー定義APIのみ
エラークラスの階層関係:
StandardError |__Warning |__Error |__InterfaceError |__DatabaseError |__DataError |__OperationalError |__IntegrityError |__InternalError |__ProgrammingError |__NotSupportedError
データベース操作例
コードは以下の通り:
#! /usr/bin/env python # -*- coding: utf-8 -*- # ************************************************************* # Filename @ operatemysql.py # Author @ Huoty # Create date @ 2015-08-16 10:44:34 # Description @ # ************************************************************* import MySQLdb # Script starts from here # 连接数据库 db_conn = MySQLdb.connect(host = 'localhost', user= 'root', passwd = '123456') # 如果已经创建了数据库,可以直接用如下方式连接数据库 #db_conn = MySQLdb.connect(host = "localhost", user = "root",passwd = "123456", db = "testdb") """ connect方法常用参数: host: 数据库主机名.默认是用本地主机 user: 数据库登陆名.默认是当前用户 passwd: 数据库登陆的秘密.默认为空 db: 要使用的数据库名.没有默认值 port: MySQL服务使用的TCP端口.默认是3306 charset: 数据库编码 """ # 获取操作游标 cursor = db_conn.cursor() # 使用 execute 方法执行SQL语句 cursor.execute("SELECT VERSION()") # 使用 fetchone 方法获取一条数据库。 dbversion = cursor.fetchone() print "Database version : %s " % dbversion # 创建数据库 cursor.execute("create database if not exists dbtest") # 选择要操作的数据库 db_conn.select_db('dbtest'); # 创建数据表SQL语句 sql = """CREATE TABLE if not exists employee( first_name CHAR(20) NOT NULL, last_name CHAR(20), age INT, sex CHAR(1), income FLOAT )""" try: cursor.execute(sql) except Exception, e: # Exception 是所有异常的基类,这里表示捕获所有的异常 print "Error to create table:", e # 插入数据 sql = """INSERT INTO employee(first_name, last_name, age, sex, income) VALUES ('%s', '%s', %d, '%s', %d)""" # Sex: Male男, Female女 employees = ( {"first_name": "Mac", "last_name": "Mohan", "age": 20, "sex": "M", "income": 2000}, {"first_name": "Wei", "last_name": "Zhu", "age": 24, "sex": "M", "income": 7500}, {"first_name": "Huoty", "last_name": "Kong", "age": 24, "sex": "M", "income": 8000}, {"first_name": "Esenich", "last_name": "Lu", "age": 22, "sex": "F", "income": 3500}, {"first_name": "Xmin", "last_name": "Yun", "age": 31, "sex": "F", "income": 9500}, {"first_name": "Yxia", "last_name": "Fun", "age": 23, "sex": "M", "income": 3500} ) try: # 清空表中数据 cursor.execute("delete from employee") # 执行 sql 插入语句 for employee in employees: cursor.execute(sql % (employee["first_name"], \ employee["last_name"], \ employee["age"], \ employee["sex"], \ employee["income"])) # 提交到数据库执行 db_conn.commit() # 对于支持事务的数据库, 在Python数据库编程中, # 当游标建立之时,就自动开始了一个隐形的数据库事务。 # 用 commit 方法能够提交事物 except Exception, e: # Rollback in case there is any error print "Error to insert data:", e #b_conn.rollback() print "Insert rowcount:", cursor.rowcount # rowcount 是一个只读属性,并返回执行execute(方法后影响的行数。) # 数据库查询操作: # fetchone() 得到结果集的下一行 # fetchmany([size=cursor.arraysize]) 得到结果集的下几行 # fetchall() 返回结果集中剩下的所有行 try: # 执行 SQL cursor.execute("select * from employee") # 获取一行记录 rs = cursor.fetchone() print rs # 获取余下记录中的 2 行记录 rs = cursor.fetchmany(2) print rs # 获取剩下的所有记录 ars = cursor.fetchall() for rs in ars: print rs # 可以用 fetchall 获得所有记录,然后再遍历 except Exception, e: print "Error to select:", e # 数据库更新操作 sql = "UPDATE employee SET age = age + 1 WHERE sex = '%c'" % ('M') try: # 执行SQL语句 cursor.execute(sql) # 提交到数据库执行 db_conn.commit() cursor.execute("select * from employee") ars = cursor.fetchall() print "After update: ------" for rs in ars: print rs except Exception, e: # 发生错误时回滚 print "Error to update:", e db.rollback() # 关闭数据库连接 db_conn.close()
その他の DB-API Python接続データベース学習を詳しく解説 関連記事 PHP中国語サイトに注目!