Python DB API规范
Python可以支持非常多的数据库管理系统,例MySQL、Oracle、SQL Server和PostgreSQL等。
Python DB API规范
使用Python对DBMS进行操作的时候,经过的步骤
- 引入API模块
- 与数据库建立连接
- 执行SQL语句
- 关闭数据库连接
mysql-connector的使用
基于DB API规范的Python库:MySQLdb、mysqlclient、PyMySQL、peewee和SQLAlchemy等。
示例
- 使用mysql-connector完成数据库的连接和使用
安装mysql-connector
pip install mysql-connector
安装后,创建数据库连接
# -*- coding: UTF-8 -*-import mysql.connector# 打开数据库连接db = mysql.connector.connect( host="localhost", user="root", passwd="XXX", # 写上你的数据库密码 database='wucai', auth_plugin='mysql_native_password')# 获取操作游标 cursor = db.cursor()# 执行SQL语句cursor.execute("SELECT VERSION()")# 获取一条数据data = cursor.fetchone()print("MySQL版本: %s " % data)# 关闭游标&数据库连接cursor.close()db.close()
运行结果
MySQL版本: 8.0.13
Connection是对数据库的当前连接进行管理
- 通过指定host、user、passwd和port等参数来创建数据库连接,分别对应数据库IP地址、用户名、密码和端口号;
- 使用db.close()关闭数据库连接;
- 使用db.cursor()创建游标,操作数据库中的数据;
- 使用db.begin()开始事务;
- 使用db.commit()和db.rollback(),对事务提交以及回滚。
通过cursor = db.cursor()创建游标后,就可以通过面向过程的编程方式对数据库中的数据进行操作:
- 使用cursor.execute(query_sql),执行数据库查询;
- 使用cursor.fetchone(),读取数据集中的一条数据;
- 使用cursor.fetchall(),取出数据集中的所有行,返回一个元组类型;
- 使用cursor.fetchmany(n),取出数据集中的多条数据,返回 一个元组;
- 使用cursor.rowcount,返回查询结果集中的行数。如果没有查询到数据或者还没有查询,则结果为1,佛祖额会返回查询到的数据行数;
- 使用cursor.close(),关闭游标。
对数据表进行增删改查
增加数据
示例
- 在player表中增加一名新球员,姓名为“约翰 科林斯”
# 插入新球员sql = "INSERT INTO player (team_id, player_name, height) VALUES (%s, %s, %s)"val = (1003, "约翰-科林斯", 2.08)cursor.execute(sql, val)db.commit()print(cursor.rowcount, "记录插入成功。")
使用过cursor.execute来执行相应的SQL语句,val为SQL语句中的参数,SQL执行后使用db.commit()进行提交。
注:使用SQL语句的时候,可以向SQL语句传递参数,这是SQL语句要统一用(%s)进行展位,否则会报错。
用游标进行SQL操作之后,还需要使用db.commit()进行提交,否则数据不会被插入。
读取数据
示例
- 查询身高大于等于2.02m的球员
# 查询身高大于等于2.08的球员sql = 'SELECT player_id, player_name, height FROM player WHERE height>=2.08'cursor.execute(sql)data = cursor.fetchall()for each_player in data: print(each_player)
运行结果
(10003, '安德烈-德拉蒙德', 2.11)(10004, '索恩-马克', 2.16)(10009, '扎扎-帕楚里亚', 2.11)(10010, '乔恩-洛伊尔', 2.08)(10011, '布雷克-格里芬', 2.08)(10015, '亨利-埃伦森', 2.11)(10023, '多曼塔斯-萨博尼斯', 2.11)(10024, '迈尔斯-特纳', 2.11)(10032, 'TJ-利夫', 2.08)(10033, '凯尔-奥奎因', 2.08)(10037, '伊凯·阿尼博古', 2.08)(10038, '约翰-科林斯', 2.08)
修改数据
示例
- 修改约翰科林斯的身高,修改成2.09
# 修改球员约翰-科林斯sql = 'UPDATE player SET height = %s WHERE player_name = %s'val = (2.09, "约翰-科林斯")cursor.execute(sql, val)db.commit()print(cursor.rowcount, "记录被修改。")
删除数据
示例
- 删除约翰科林斯这个球员
sql = 'DELETE FROM player WHERE player_name = %s'val = ("约翰-科林斯",)cursor.execute(sql, val)db.commit()print(cursor.rowcount, "记录删除成功。")
最后执行完,要关闭游标和数据库的连接
cursor.close()db.close()
注意事项
- 打开数据库连接以后,如果不再使用,则需要关闭数据库连接,以免造成资源浪费
- 在对数据进行增加、删除和修改的时候,可能出现异常,这时需要用try...except捕获异常信息。
示例
import tracebacktry: sql = "INSERT INTO player (team_id, player_name, height) VALUES (%s, %s, %s)" val = (1003, "约翰-科林斯", 2.08) cursor.execute(sql, val) db.commit() print(cursor.rowcount, "记录插入成功。")except Exception as e: # 打印异常信息 traceback.print_exc() # 回滚 db.rollback()finally: # 关闭数据库连接 db.close()
总结