ホームページ >バックエンド開発 >Python チュートリアル >DB-API for Python接続からデータベース学習まで詳しく解説

DB-API for Python接続からデータベース学習まで詳しく解説

高洛峰
高洛峰オリジナル
2017-02-13 16:21:511960ブラウズ

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データベース接続プロセス:

DB-API for Python接続からデータベース学習まで詳しく解説

connectを使用して接続を作成します

connectメソッドはconnectオブジェクトを生成し、それを通じてデータベースにアクセスします。この規格に準拠するモジュールは connect メソッドを実装します。

connect 関数のパラメータは次のとおりです:

  • user ユーザー名

  • password パスワード

  • host ホスト名

  • database データベース名

  • DSN データソース名

データベース接続パラメータは、DSN 文字列の形式で提供できます。例: connect(dsn='host:MYDB',user='root',password=' ')
もちろん、異なるデータベース インターフェイス プログラムでは、たとえば、MySQLdb は、仕様で推奨されているデータベース パラメーターの代わりに db パラメーターを使用して、アクセスするデータベースを示します。

host: データベースのホスト名。デフォルトはローカルホストを使用します

  • user: データベースのログイン名、デフォルトは現在のユーザーです

  • 、デフォルトは空です

  • db: 使用されるデータベース名。デフォルト値はありません。

  • PORT: mysql サービスで使用される TCP ポート。デフォルトは 3306 です。パラメータを使用します:

  • Dbname - データベース名 (DSN 接続モード)

  • database - データベース名

user - ユーザー名

password - パスワード– サーバーアドレス (場合デフォルトの接続 Unix Socket は提供されません)
  • port – 接続ポート (デフォルト 5432)
  • connect オブジェクトには次のメソッドがあります:

  • close(): この接続オブジェクトを閉じます。閉じた後は、接続が再度作成されない限り、それ以上の操作は実行できません。
  • commit(): 現在のトランザクションを送信します (トランザクションをサポートするデータベースであり、追加、削除、または変更後にコミットがない場合)。データベースはデフォルトでロールバックされます

  • rollback(): 現在のトランザクションをキャンセルします

cursor(): カーソルオブジェクトを作成します

  • カーソルを使用して作成しますカーソルオブジェクト

  • カーソルカーソルオブジェクトは次のプロパティとメソッド:
  • 共通メソッド:

  • close(): このカーソルオブジェクトを閉じる

fetchone(): 結果セットを取得します 次の行

fetchmany([size = Cursor.arraysize]): 結果セットの次の数行を取得します


fetchall(): 結果セットの残りのすべての行を取得します

excute(sql[, args ]): データベースクエリを実行します。コマンド
  • excutemany(sql, args): 複数のデータベースクエリまたはコマンドを実行します
  • 共通属性:
  • connection: このカーソルオブジェクトのデータベース接続を作成します

  • arraysize :何個レコードは fetchmany() メソッドを使用して一度に取得され、デフォルトは 1 です

  • lastrowid: PHP の last_inset_id() と同等

その他のメソッド:

  • __iter__( ):反復可能なオブジェクト (オプション)
  • next(): 結果セットの次の行を取得します (反復がサポートされている場合)

  • nextset(): 次の結果セットに移動します (サポートされている場合)

callproc(func[,args]): ストアド プロシージャを呼び出します

setinputsizes(sizes): 最大入力値を設定します (必須ですが、特定の実装はオプションです)
  • 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中国語サイトに注目!

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。