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


Posted in Python onFebruary 07, 2017

前言

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

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

Python连接数据库流程:

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

使用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 相关文章推荐
python实现简单温度转换的方法
Mar 13 Python
安装dbus-python的简要教程
May 05 Python
Python与Java间Socket通信实例代码
Mar 06 Python
python爬虫 正则表达式使用技巧及爬取个人博客的实例讲解
Oct 20 Python
Python实现的多线程同步与互斥锁功能示例
Nov 30 Python
详解python中的hashlib模块的使用
Apr 22 Python
Python操作MySQL数据库实例详解【安装、连接、增删改查等】
Jan 17 Python
Python3 hashlib密码散列算法原理详解
Mar 30 Python
使用python批量转换文件编码为UTF-8的实现
Apr 03 Python
Python爬虫之Spider类用法简单介绍
Aug 04 Python
详解python内置模块urllib
Sep 09 Python
python爬虫中采集中遇到的问题整理
Nov 27 Python
使用Python中的tkinter模块作图的方法
Feb 07 #Python
Scrapy-redis爬虫分布式爬取的分析和实现
Feb 07 #Python
详解python中字典的循环遍历的两种方式
Feb 07 #Python
python3使用PyMysql连接mysql数据库实例
Feb 07 #Python
Python处理文本文件中控制字符的方法
Feb 07 #Python
关于numpy中np.nonzero()函数用法的详解
Feb 07 #Python
Python脚本实现自动将数据库备份到 Dropbox
Feb 06 #Python
You might like
PHP操作XML作为数据库的类
2010/12/19 PHP
如何解决CI框架的Disallowed Key Characters错误提示
2013/07/05 PHP
PHP递归创建多级目录
2015/11/05 PHP
PHP响应post请求上传文件的方法
2015/12/17 PHP
PHP getNamespaces()函数讲解
2019/02/03 PHP
JS与框架页的操作代码
2010/01/17 Javascript
使用JavaScript动态设置样式实现代码及演示动画
2013/01/25 Javascript
js中的getAttribute方法使用示例
2014/08/01 Javascript
Javascript基础教程之switch语句
2015/01/18 Javascript
jQuery对指定元素中指定字符串进行替换的方法
2015/03/17 Javascript
js点击返回跳转到指定页面实现过程
2020/08/20 Javascript
javascript加载xml 并解析各节点的值(实现方法)
2016/10/12 Javascript
layui 优化button按钮和弹出框的方法
2018/08/15 Javascript
vue canvas绘制矩形并解决由clearRec带来的闪屏问题
2019/09/02 Javascript
微信小程序事件流原理解析
2019/11/27 Javascript
JS实现购物车基本功能
2020/11/08 Javascript
Element-ui 自带的两种远程搜索(模糊查询)用法讲解
2021/01/29 Javascript
[55:23]VGJ.T vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python bsddb模块操作Berkeley DB数据库介绍
2015/04/08 Python
python黑魔法之参数传递
2016/02/12 Python
Python操作SQLite/MySQL/LMDB数据库的方法
2019/11/07 Python
python isinstance函数用法详解
2020/02/13 Python
python实现密码强度校验
2020/03/18 Python
Python3 shelve对象持久存储原理详解
2020/03/23 Python
Python基于进程池实现多进程过程解析
2020/04/30 Python
序列化Python对象的方法
2020/08/01 Python
珍珠奶茶店创业计划书
2014/01/11 职场文书
大学四年的个人自我评价
2014/01/14 职场文书
个人简历自荐信
2014/06/26 职场文书
作风建设剖析材料
2014/10/06 职场文书
初中生300字旷课检讨书
2014/11/19 职场文书
2015婚礼主持词开场白
2015/05/28 职场文书
党小组意见范文
2015/06/08 职场文书
六一亲子活动感想
2015/08/07 职场文书
送给客户微信问候语!
2019/07/04 职场文书
Go 语言结构实例分析
2021/07/04 Golang