前言

大家都知道在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通过connect对象连接数据库对吗_Python连接数据库学习之DB-API详解相关推荐

  1. python通过connect对象连接数据库对吗_python连接数据库:

    import pymysql 创建connectinon对象: con = pymysql.connect(host = "localhost",user = "root ...

  2. python的sort方法是哪种_python中的sort方法使用详解

    Python中的sort()方法用于数组排序,本文以实例形式对此加以详细说明: 一.基本形式列表有自己的sort方法,其对列表进行原址排序,既然是原址排序,那显然元组不可能拥有这种方法,因为元组是不可 ...

  3. 在python中使用关键字define定义函数_python自定义函数def的应用详解

    这里是三岁,来和大家唠唠自定义函数,这一个神奇的东西,带大家白话玩转自定义函数 自定义函数,编程里面的精髓! def 自定义函数的必要函数:def 使用方法:def 函数名(参数1,参数2,参数-): ...

  4. python对输入的字符串进行解析_python数据类型_字符串常用操作(详解)

    这次主要介绍字符串常用操作方法及例子 1.python字符串 在python中声明一个字符串,通常有三种方法:在它的两边加上单引号.双引号或者三引号,如下: name = 'hello' name1 ...

  5. python如何调用文件进行换位加密_python 换位密码算法的实例详解

    python 换位密码算法的实例详解 一前言: 换位密码基本原理:先把明文按照固定长度进行分组,然后对每一组的字符进行换位操作,从而实现加密.例如,字符串"Error should neve ...

  6. python爬取app中的音频_Python爬取喜马拉雅音频数据详解

    码农公社  210.net.cn  210是何含义?10月24日是程序员节,1024 =210.210既 210 之意. Python爬取喜马拉雅音频数据详解 一.项目目标 爬取喜马拉雅音频数据 受害 ...

  7. python中for in range的用法_Python for i in range ()用法详解

    for i in range ()作用: range()是一个函数, for i in range () 就是给i赋值: 比如 for i in range (1,3): 就是把1,2依次赋值给i r ...

  8. python中 for i in range(10)_Python for i in range ()用法详解

    for i in range ()作用: range()是一个函数, for i in range () 就是给i赋值: 比如 for i in range (1,3): 就是把1,2依次赋值给i r ...

  9. python装饰器函数执行后日志_Python装饰器使用规范案例详解

    >>> def now(): ... print('2015-3-25') ... >>> f = now >>> f() 2015-3-25 函 ...

最新文章

  1. Jupiter:Facebook的高性能job-matching服务
  2. PingingLab传世经典系列《CCNA完全配置宝典》-3.2 VLAN进阶配置
  3. Oracle数据库中的SOUNDEX函数
  4. 配置mysql数据库时出再错误:LookupError No installed app with label admin(亲测)
  5. linux的常用操作——makefile
  6. 【Python】Pandas高效加载JSON文件
  7. 使用友元,编译出错fatal error C1001: INTERNAL COMPILER ERROR (compiler file 'msc1.cpp', line 1786) 的解决...
  8. mysql存储过程中删除定时器_mysql创建存储过程,定时任务,定时删除log 莫大人...
  9. lighttpd + php for android
  10. IV-18(前苏联ИВ-18)荧光管电子钟【Energy Pillar.能量柱】
  11. mysql 综合练习
  12. Flask框架基础入门教程
  13. 什么是服务器集群?集群服务器有什么好处
  14. Classification metrics can't handle a mix of continuous and multiclass targets
  15. NMOS管与PMOS管的区别与总结
  16. 3.7V降压3V超低功耗稳压芯片,外围简单
  17. 9.cisco思科模拟器端口安全和故障排除练习题
  18. Firefox配置阿里云DNS
  19. 赋范线性空间上的有界线性泛函
  20. 大道至简 | 设计 ViT 到底怎么配置Self-Attention才是最合理的?

热门文章

  1. 姜健:为开源工作幸福且自豪
  2. 数据结构与算法之母牛生牛
  3. 腾讯云首次公开边缘计算网络开源平台,拥抱5G与万物互联
  4. EPOLL事件之EPOLLRDHUP
  5. ubuntu下载工具aria2 uGet
  6. 使用hiredis实现redis分布式锁
  7. Spark _01初识
  8. 【echart数组数据】echarts两条或两条以上x轴不同的线合并x轴 含有不连续数据
  9. gradle中的增量构建
  10. Mybatis generator 1.4.x 入门教程--转载