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

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

Feb 13, 2017 pm 04:21 PM

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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

LinuxターミナルでPythonバージョンを表示するときに発生する権限の問題を解決する方法は? LinuxターミナルでPythonバージョンを表示するときに発生する権限の問題を解決する方法は? Apr 01, 2025 pm 05:09 PM

LinuxターミナルでPythonバージョンを表示する際の許可の問題の解決策PythonターミナルでPythonバージョンを表示しようとするとき、Pythonを入力してください...

あるデータフレームの列全体を、Python内の異なる構造を持つ別のデータフレームに効率的にコピーする方法は? あるデータフレームの列全体を、Python内の異なる構造を持つ別のデータフレームに効率的にコピーする方法は? Apr 01, 2025 pm 11:15 PM

PythonのPandasライブラリを使用する場合、異なる構造を持つ2つのデータフレーム間で列全体をコピーする方法は一般的な問題です。 2つのデータがあるとします...

文字列を介してオブジェクトを動的に作成し、Pythonでメソッドを呼び出す方法は? 文字列を介してオブジェクトを動的に作成し、Pythonでメソッドを呼び出す方法は? Apr 01, 2025 pm 11:18 PM

Pythonでは、文字列を介してオブジェクトを動的に作成し、そのメソッドを呼び出す方法は?これは一般的なプログラミング要件です。特に構成または実行する必要がある場合は...

uvicornは、serving_forever()なしでhttpリクエストをどのように継続的に聞いていますか? uvicornは、serving_forever()なしでhttpリクエストをどのように継続的に聞いていますか? Apr 01, 2025 pm 10:51 PM

UvicornはどのようにしてHTTPリクエストを継続的に聞きますか? Uvicornは、ASGIに基づく軽量のWebサーバーです。そのコア機能の1つは、HTTPリクエストを聞いて続行することです...

人気のあるPythonライブラリとその用途は何ですか? 人気のあるPythonライブラリとその用途は何ですか? Mar 21, 2025 pm 06:46 PM

この記事では、numpy、pandas、matplotlib、scikit-learn、tensorflow、django、flask、and requestsなどの人気のあるPythonライブラリについて説明し、科学的コンピューティング、データ分析、視覚化、機械学習、Web開発、Hの使用について説明します。

プロジェクトの基本と問題駆動型の方法で10時間以内にコンピューター初心者プログラミングの基本を教える方法は? プロジェクトの基本と問題駆動型の方法で10時間以内にコンピューター初心者プログラミングの基本を教える方法は? Apr 02, 2025 am 07:18 AM

10時間以内にコンピューター初心者プログラミングの基本を教える方法は?コンピューター初心者にプログラミングの知識を教えるのに10時間しかない場合、何を教えることを選びますか...

中間の読書にどこでもfiddlerを使用するときにブラウザによって検出されないようにするにはどうすればよいですか? 中間の読書にどこでもfiddlerを使用するときにブラウザによって検出されないようにするにはどうすればよいですか? Apr 02, 2025 am 07:15 AM

fiddlereveryversings for the-middleの測定値を使用するときに検出されないようにする方法

See all articles