Python连接数据库学习之DB-API详解

发布时间 - 2026-01-10 22:54:08    点击率:

前言

大家都知道在Python中如果要连接数据库,不管是MySQL、SQL Server、PostgreSQL亦或是SQLite,使用时都是采用游标的方式,所以就不得不学习Python DB-API。

Python所有的数据库接口程序都在一定程度上遵守 Python DB-API 规范。DB-API定义了一系列必须的对象和数据库存取方式,以便为各种底层数据库系统和多种多样的数据库接口程序提供一致的访问接口。由于DB-API 为不同的数据库提供了一致的访问接口, 在不同的数据库之间移植代码成为一件轻松的事情。

Python连接数据库流程:

使用connect创建connection连接

connect 方法生成一个 connect 对象, 我们通过这个对象来访问数据库。符合标准的模块都会实现 connect 方法。

connect 函数的参数如下所示:

  • user Username
  • password Password
  • host Hostname
  • database Database name
  • dsn Data source name

数据库连接参数可以以一个 DSN 字符串的形式提供,示例:connect(dsn='host:MYDB',user='root',password=' ')
当然,不同的数据库接口程序可能有些差异,并非都是严格按照规范实现,例如MySQLdb则使用 db 参数而不是规范推荐的 database 参数来表示要访问的数据库:

MySQLdb连接时可用参数

  • host: 数据库主机名.默认是用本地主机
  • user: 数据库登陆名.默认是当前用户
  • passwd: 数据库登陆的秘密.默认为空
  • db: 要使用的数据库名.没有默认值
  • port: MySQL服务使用的TCP端口.默认是3306
  • charset: 数据库编码

psycopg2连接时可用参数:

  • dbname – 数据库名称 (dsn连接模式)
  • database – 数据库名称
  • user – 用户名
  • password – 密码
  • host – 服务器地址 (如果不提供默认连接Unix Socket)
  • port – 连接端口 (默认5432)

其中connect对象又有如下方法:

  • close():关闭此connect对象, 关闭后无法再进行操作,除非再次创建连接
  • commit():提交当前事务,如果是支持事务的数据库执行增删改后没有commit则数据库默认回滚
  • rollback():取消当前事务
  • cursor():创建游标对象

使用cursor创建游标对象

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]):设置大列 fetch 的最大缓冲区大小

其他属性:

  • 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()

其他参考文档:

https://www.python.org/dev/peps/pep-0249/

http://wiki.python.org/moin/DatabaseInterfaces

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。


# python  # db  # api  # 2.0  # 连接数据库  # python使用mysqldb连接数据库操作方法示例详解  # python连接数据库的方法  # python mysqldb连接数据库  # 跟老齐学Python之通过Python连接数据库  # Python使用sqlalchemy模块连接数据库操作示例  # 学习python之编写简单简单连接数据库并执行查询操作  # Python 3.x 连接数据库示例(pymysql 方式)  # Python使用Flask-SQLAlchemy连接数据库操作示例  # 解决python3 Pycharm上连接数据库时报错的问题  # Python与数据库交互:入门指南  # 可选  # 都是  # 又有  # 数据库查询  # 行号  # 要使  # 为空  # 默认值  # 几行  # 行数  # 是一个  # 迭代  # 大家都  # 多个  # 就不  # 可以用  # 遍历  # 之时  # 然后再 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  Python企业级消息系统教程_KafkaRabbitMQ高并发应用  如何在阿里云虚拟主机上快速搭建个人网站?  如何快速辨别茅台真假?关键步骤解析  Laravel如何配置和使用缓存?(Redis代码示例)  大连 网站制作,大连天途有线官网?  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  动图在线制作网站有哪些,滑动动图图集怎么做?  Python面向对象测试方法_mock解析【教程】  JS中对数组元素进行增删改移的方法总结  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  教你用AI将一段旋律扩展成一首完整的曲子  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  Laravel如何实现API速率限制?(Rate Limiting教程)  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  UC浏览器如何设置启动页 UC浏览器启动页设置方法  如何用免费手机建站系统零基础打造专业网站?  Python高阶函数应用_函数作为参数说明【指导】  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  如何用景安虚拟主机手机版绑定域名建站?  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言  如何在IIS7中新建站点?详细步骤解析  Python文件操作最佳实践_稳定性说明【指导】  如何为不同团队 ID 动态生成多个非值班状态按钮  微信小程序 require机制详解及实例代码  如何挑选优质建站一级代理提升网站排名?  javascript中数组(Array)对象和字符串(String)对象的常用方法总结  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  Python数据仓库与ETL构建实战_Airflow调度流程详解  如何破解联通资金短缺导致的基站建设难题?  Python3.6正式版新特性预览  php json中文编码为null的解决办法  如何基于云服务器快速搭建网站及云盘系统?  html5如何实现懒加载图片_ intersectionobserver api用法【教程】  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  零服务器AI建站解决方案:快速部署与云端平台低成本实践  如何正确选择百度移动适配建站域名?  手机软键盘弹出时影响布局的解决方法  Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用  深圳网站制作培训,深圳哪些招聘网站比较好?  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  如何用IIS7快速搭建并优化网站站点?  进行网站优化必须要坚持的四大原则  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程