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

前言

大家都知道在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

总结

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

(0)

相关推荐

  • Python实现的多线程http压力测试代码

    本文实例讲述了Python实现的多线程http压力测试代码.分享给大家供大家参考,具体如下: # Python version 3.3 __author__ = 'Toil' import sys, getopt import threading def httpGet(url, file): import http.client conn = http.client.HTTPConnection(url) conn.request("GET", file) r = conn.getr

  • python使用matplotlib绘制折线图教程

    matplotlib简介 matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地行制图.而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中. 它的文档相当完备,并且Gallery页面中有上百幅缩略图,打开之后都有源程序.因此如果你需要绘制某种类型的图,只需要在这个页面中浏览/复制/粘贴一下,基本上都能搞定. 在Linux下比较著名的数据图工具还有gnuplot,这个是免费的,Python有一个包可以调用gnuplot,但是语法比较不

  • python3.5实现socket通讯示例(TCP)

    TCP连接: tcp是面向连接的一个协议,意味着,客户端和服务器开发发送数据之前,需要先握手创建一个TCP连接.TCP连接的一端与客户端套接字相互联系,另一端与服务器套接字相联系.当创建该TCP连接的时,我们需要讲客户端与服务器的套接字地址(IP地址和端口号)关联起来.使用创建的TCP连接,当一侧要向另一侧发送数据的时候,它只需要经过其套接字将数据丢给TCP连接,不需要再次附上目的地址. 使用TCP连接的客户-服务器程序: TCPServer.py import socket import so

  • Python如何实现守护进程的方法示例

    场景设置: 你编写了一个python服务程序,并且在命令行下启动,而你的命令行会话又被终端所控制,python服务成了终端程序的一个子进程.因此如果你关闭了终端,这个命令行程序也会随之关闭. 要使你的python服务不受终端影响而常驻系统,就需要将它变成守护进程. 守护进程就是Daemon程序,是一种在系统后台执行的程序,它独立于控制终端并且执行一些周期任务或触发事件,通常被命名为"d"字母结尾,如常见的httpd.syslogd.systemd和dockerd等. 代码实现 pyth

  • Ubuntu下创建虚拟独立的Python环境全过程

    前言 虚拟环境是程序执行时的独立执行环境,在同一台服务器中可以创建不同的虚拟环境供不同的系统使用,项目之间的运行环境保持独立性而相互不受影响.例如项目可以在基于 Python2.7 的环境中运行,而项目 B 可以在基于Python3.x 的环境中运行.在 Python 中通过 virtualenv 工具管理虚拟环境. 另外在 win 或者 mac 上也是极力推荐安装虚拟环境来管理你的 Python 环境,虚拟环境能为你带来不少好处,比如在 Mac 上,自带的 Python 环境为 2.7 .而我

  • Python实现简单的多任务mysql转xml的方法

    本文实例讲述了Python实现简单的多任务mysql转xml的方法.分享给大家供大家参考,具体如下: 为了需求导出的格式尽量和navicat导出的xml一致. 用的gevent,文件i/o操作会阻塞,所以并不会完全异步. 1. mysql2xml.py: # -*- coding: utf-8 -*- ''' Created on 2014/12/27 @author: Yoki ''' import gevent import pymysql from pymysql.cursors impo

  • Python中str is not callable问题详解及解决办法

    Python中str is not callable问题详解及解决办法 问题提出: 在Python的代码,在运行过程中,碰到了一个错误信息: python代码: def check_province_code(province, country): num = len(province) while num <3: province = ''.join([str(0),province]) num = num +1 return country + province 运行的错误信息: check

  • Python使用QQ邮箱发送Email的方法实例

    前言 其实Python使用QQ邮箱发送Email代码很简单,短短几行代码就可以实现这个功能. 使用到的模块有smtplib和email这个两个模块,关于这两个模块的方法就不多说了.不了解的朋友们可以查看这篇文章:python中使用smtplib和email模块发送邮件实例 我们先说说网上常用的使用这那两个模块发送邮件的方法 代码如下: import smtplib from email.mime.text import MIMEText from email.header import Head

  • Python OpenCV学习之图像滤波详解

    目录 背景 一.卷积相关概念 二.卷积实战 三.均值滤波 四.高斯滤波 五.中值滤波 六.双边滤波 七.Sobel算子 八.Scharr算子 九.拉普拉斯算子 十.Canny算法 背景 图像滤波的作用简单来说就是将一副图像通过滤波器得到另一幅图像:明确一个概念,滤波器又被称为卷积核,滤波的过程又被称为卷积:实际上深度学习就是训练许多适应任务的滤波器,本质上就是得到最佳的参数:当然在深度学习之前,也有一些常见的滤波器,本篇主要介绍这些常见的滤波器: 一.卷积相关概念 卷积核大小一般为奇数的原因:

  • Python Pandas学习之基本数据操作详解

    目录 1索引操作 1.1直接使用行列索引(先列后行) 1.2结合loc或者iloc使用索引 1.3使用ix组合索引 2赋值操作 3排序 3.1DataFrame排序 3.2Series排序 为了更好的理解这些基本操作,下面会通过读取一个股票数据,来进行Pandas基本数据操作的语法介绍. # 读取文件(读取保存文件后面会专门进行讲解,这里先直接调用下api) data = pd.read_csv("./data/stock_day.csv")  # 读取当前目录下一个csv文件 # 删

  • Python集成学习之Blending算法详解

    一.前言 普通机器学习:从训练数据中学习一个假设. 集成方法:试图构建一组假设并将它们组合起来,集成学习是一种机器学习范式,多个学习器被训练来解决同一个问题. 集成方法分类为: Bagging(并行训练):随机森林 Boosting(串行训练):Adaboost; GBDT; XgBoost Stacking: Blending: 或者分类为串行集成方法和并行集成方法 1.串行模型:通过基础模型之间的依赖,给错误分类样本一个较大的权重来提升模型的性能. 2.并行模型的原理:利用基础模型的独立性,

  • Python Pandas学习之Pandas数据结构详解

    目录 1Pandas介绍 2Pandas数据结构 2.1Series 2.2DataFrame 1 Pandas介绍 2008年WesMcKinney开发出的库 专门用于数据挖掘的开源python库 以Numpy为基础,借力Numpy模块在计算方面性能高的优势 基于matplotlib,能够简便的画图 独特的数据结构 Numpy已经能够帮助我们处理数据,能够结合matplotlib解决部分数据展示等问题,那么pandas学习的目的在什么地方呢? 增强图表可读性 便捷的数据处理能力 读取文件方便

  • Python PyQt5学习之样式设置详解

    目录 为标签添加背景图片 为按钮添加背景图片 缩放图片 设置窗口透明 为标签添加背景图片 import sys from PyQt5.QtGui import * from PyQt5.QtCore import * from PyQt5.QtWidgets import * if __name__ == "__main__": app = QApplication(sys.argv) win = QMainWindow() label = QLabel() label.setTool

  • Python基础学习之基本数据结构详解【数字、字符串、列表、元组、集合、字典】

    本文实例讲述了Python基础学习之基本数据结构.分享给大家供大家参考,具体如下: 前言 相比于PHP,Python同样也是脚本解析语言,所以在使用Python的时候,变量和数据结构相对于编译语言来说都会简单许多,但是Python相比于PHP来说,变量类型的定义会比较严格:string->int的转换没有PHP那么方便.但这也让程序稳定性有所提升,例如和客户端交互的时候,数据库取出来的数字int和缓存取出来的数字(默认是string)需要手动进行转换(否则会有报错提示),而PHP不需要手动转换的

  • python标准库学习之sys模块详解

    目录 前言 处理命令行参数 sys.exit(n) 退出程序,正常退出时exit(0) sys.version 获取Python解释程序的版本信息 sys.platform 返回操作系统平台名称 sys.stdin.readline()与input sys.stdout与print 总结 补充:sys 模块的实例 前言 sys模块是与python解释器交互的一个接口.sys 模块提供了许多函数和变量来处理 Python 运行时环境的不同部分. 处理命令行参数 在解释器启动后, argv 列表包含

  • Python标准库学习之psutil内存详解

    目录 查询CPU信息 查询内存信息 查询磁盘信息 查询网络信息 查询进程信息 人生苦短,快学Python! 今天介绍的是psutil模块,它是一个跨平台库 https://github.com/giampaolo/psutil 命令行下通过pip安装: pip install psutil 如果跟我一样安装的是Anaconda,则剩下这步了,因为自带了. 顾名思义 psutil = process and system utilities 它专门用来获取操作系统以及硬件相关的信息,比如:CPU.

  • Python学习之循环方法详解

    目录 for循环 while循环 拓展:列表推导式 常见的推导式方法 循环的继续与退出(continue与break) continue的使用 break的使用 循环实现九九乘法表 什么是循环? —> 循环是有着周而复始的运动或变化的规律:在 Python 中,循环的操作也叫做 ‘遍历’ . 与现实中一样,Python 中也同样存在着无限循环的 方法与有限循环的方法.接下来我们就先看看有限循环的方法 —> for 循环 for 循环 for 循环的功能:通过 for 关键字将列表.元组.字符串

  • Python学习之面向对象编程详解

    目录 什么是面向对象编程(类) 类的关键字-class 类的定义与使用 类的参数-self self的解析与总结 类的构造函数 构造函数的创建方法 关于对象的生命周期 什么是面向对象编程(类) 利用(面向)对象的(属性和方法)去进行编码的过程即面向对象编程 自定义对象数据类型就是面向对象中的类(class)的概念 类的关键字 - class class 关键字用来声明类,类的名称首字母大写,多单词的情况下每个单词首字母大写(即驼峰命名法).在我们一开始学习 Python 的时候说过,要尽量避免使

随机推荐