侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

Python  /  管理员 发布于 7年前   228

前言

大家都知道在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 C 数据库名称 (dsn连接模式)
  • database C 数据库名称
  • user C 用户名
  • password C 密码
  • host C 服务器地址 (如果不提供默认连接Unix Socket)
  • port C 连接端口 (默认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 rsexcept 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中字典的setdefault()方法教程
    下一条:
    使用Python中的tkinter模块作图的方法
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客