首页 > 数据库 >python db-api的使用流程_Python连接数据库学习之DB-API详解

python db-api的使用流程_Python连接数据库学习之DB-API详解

来源:互联网 2026-07-28 16:40:04

在没有 Python DB-API 之前,各数据库之间的应用接口非常混乱,实现各不相同。如果项目需要更换数据库时,则需要做大量的修改,非常不便。Python DB-API 的出现就是为了解决这样的问题。本文主要介绍了Python连接数据库之DB

在没有 Python DB-API 之前,各数据库之间的应用接口相当混乱,实现方式各不相同。一旦项目需要更换数据库,往往意味着大面积的代码修改,非常折腾。Python DB-API 的出现,就是为了终结这种混乱——它定义了一套统一的访问接口,让开发者能像操作同一类数据库一样,轻松地在不同数据库之间迁移。

本文主要围绕 Python 连接数据库时的 DB-API 规范展开,从核心概念到具体操作,一步步梳理清楚。

长期稳定更新的攒劲资源: >>>点此立即查看<<<

前言

在 Python 中,无论是连接 MySQL、SQL Server、PostgreSQL 还是 SQLite,操作方式都遵循着同样的模式:通过游标(cursor)来执行 SQL 语句。这就意味着,理解 Python DB-API 是绕不开的一步。

Python 所有的数据库接口程序,在实现上都遵循 DB-API 规范。这个规范定义了一系列必须的对象和数据库存取方法,为底层各种数据库系统提供了统一的访问接口。正因为有了 DB-API,在不同数据库之间移植代码才真正变得轻松。

Python 连接数据库的通用流程

首先,通过 connect 方法创建一个连接对象(connection),所有的数据库操作都基于这个连接。符合 DB-API 标准的模块,都会实现 connect 方法。其参数通常包括:

  • user:用户名
  • password:密码
  • host:主机名
  • database:数据库名
  • dsn:数据源名称(可以以字符串形式提供,例如 connect(dsn='host:MYDB', user='root', password=' ')

当然,不同数据库接口在参数命名上会有些差异。比如 MySQLdb 用的是 db 参数,而不是规范推荐的 database;而 psycopg2 则同时支持 dbnamedatabase。下面列出常见模块的典型参数:

MySQLdb 连接参数:

  • host:数据库主机名,默认本地主机
  • user:数据库登录名,默认当前用户
  • passwd:登录密码,默认空
  • db:要使用的数据库名(无默认值)
  • port:MySQL 服务 TCP 端口,默认 3306
  • charset:数据库编码

psycopg2 连接参数:

  • dbnamedatabase:数据库名称
  • user:用户名
  • password:密码
  • host:服务器地址(不提供则默认连接 Unix Socket)
  • port:连接端口,默认 5432

连接对象 connection 提供以下常用方法:

  • close():关闭连接,关闭后无法再操作,除非重新创建
  • commit():提交当前事务。对于支持事务的数据库,增删改操作后若没有 commit,则默认回滚
  • rollback():取消当前事务
  • cursor():创建游标对象

使用 cursor 创建游标对象

游标对象(cursor)是真正执行 SQL 语句的接口。它的常用方法和属性如下:

常用方法:

  • close():关闭游标
  • fetchone():获取结果集的下一行
  • fetchmany([size = cursor.arraysize]):获取结果集的下几行
  • fetchall():获取结果集中剩下的所有行
  • execute(sql[, args]):执行一个数据库查询或命令
  • executemany(sql, args):执行多个数据库查询或命令

常用属性:

  • connection:创建此游标的数据库连接
  • arraysize:使用 fetchmany() 时一次取出的记录数,默认为 1
  • lastrowid:相当于 PHP 的 last_insert_id()

其他方法(可选):

  • __iter__():创建可迭代对象
  • next():获取结果集下一行(如果支持迭代)
  • nextset():移到下一个结果集
  • callproc(func[, args]):调用存储过程
  • setinputsizes(sizes):设置输入最大值(必须有,但具体实现可选)
  • setoutputsizes(sizes[, col]):设置大列 fetch 的最大缓冲区大小

其他属性:

  • description:返回游标活动状态,包含 7 个元素的元组:(name, type_code, display_size, internal_size, precision, scale, null_ok),其中只有 nametype_code 是必需的
  • rowcount:最近一次 execute() 创建或影响的行数
  • messages:游标执行后数据库返回的信息元组(可选)
  • rownumber:当前结果集中游标所在行的索引(起始行号为 0)

DB-API 中的错误定义

错误类的层次结构如下:

StandardError
|__Warning
|__Error
    |__InterfaceError
    |__DatabaseError
        |__DataError
        |__OperationalError
        |__IntegrityError
        |__InternalError
        |__ProgrammingError
        |__NotSupportedError

了解这些错误类型,有助于在开发中精准捕获异常,提升程序健壮性。

数据库操作示例

下面以 MySQLdb 为例,展示完整的连接、建表、插入、查询、更新操作流程。代码中包含了详细的注释,建议直接运行观察效果。

#! /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()

侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述

热游推荐

更多
湘ICP备14008430号-1 湘公网安备 43070302000280号
All Rights Reserved
本站为非盈利网站,不接受任何广告。本站所有软件,都由网友
上传,如有侵犯你的版权,请发邮件给xiayx666@163.com
抵制不良色情、反动、暴力游戏。注意自我保护,谨防受骗上当。
适度游戏益脑,沉迷游戏伤身。合理安排时间,享受健康生活。