Python中连接Mysql的包
MySQLdb 是用于Python链接Mysql数据库的接口,它实现了 Python 数据库 API 规范 V2.0,基于 MySQL C API 上建立的
支持 Python2.x mysqlclient 原生 SQL 来操作数据库 支持 Python3.x
PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库
mysql-connector 是 MySQL 官方提供的驱动器 mysql-connector 是 MySQL 官方提供的驱动器,
它在Python中重新实现MySQL协议 不需要C库,因此可移植性好 pip install mysql-connector
ORM 框架 orm 英文全称 object relational mapping 即对象映射关系程序
SQLAlchemy 是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作
SQLAlchemy本身无法操作数据库,其必须以来pymsql等第三方插件
peewee
SQL中的DB-API
01.-- 用户可以使用这些数据生成的SQL代码并立即执行或输出 如果不使用游标功能,
直接使用select查询,会一次性将结果集打印到屏幕上,你无法针对结果集做第二次编程
02.查询语句可能返回多条记录,如果数据量非常大,需要使用游标来逐条读取查询结果集中的记录
游标(CURSOR)
游标(CURSOR)的特殊性在于它可以用循环对返回值进行逐条编译,它具有只读性、不可跳跃性和迟钝性
声明(declare)、打开(open)、关闭(close)游标,并如何利用FETCH分别访问它的每一行
游标是一种处理数据的方法,主要用于存储过程,触发器和 T_SQL脚本中, 游标功能可以帮助我们对SQL语句得到的结果集,进行二次开发
支持事务的数据库, 在Python数据库编程中,当游标建立之时,就自动开始了一个隐形的数据库事务。
SELECT 语句后获取数据,你可以把游标作为 iterator,然后调用它的 fetchone() 方法来获取一条匹配的行,
也可以调用 fetchall() 来得到包含多个匹配行的列表
commit()方法游标的所有更新操作,rollback()方法回滚当前游标的所有操作
03. DB-API ,用于处理基于SQL的数据库 Python中如果要连接数据库,
不管是MySQL、SQL Server、PostgreSQL亦或是SQLite,使用时都是采用游标的方式
Python所有的数据库接口程序都在一定程度上遵守 Python DB-API 规范。
DB-API只中的错误定义
错误类的层次关系:
StandardError
|__Warning
|__Error
|__InterfaceError
|__DatabaseError
|__DataError
|__OperationalError
|__IntegrityError
|__InternalError
|__ProgrammingError
|__NotSupportedError
过程说明
1.Python DB-API 规范
DB-API定义了一系列必须的对象和数据库存取方式,以便为各种底层数据库系统和多种多样的数据库接口程序提供一致的访问接口
DB-API与底层数据库交互示例:
代码 ⇆ 使用DB-API ⇆ 数据库驱动程序 ⇆ 底层数据库(如MySQL等)
DB-API 2.0 规范的接口,这个规范是 PEP 249。
2.过程:
# 01.打开数据库连接
pymysql 可以支持查询结果为字典类型,只需要指定cursorclass是pymysql.cursors.DictCursor即可
pymysql.cursors.Cursor(connection)#游标结果作为元祖的元祖返回 Cursor: 默认,元组类型
SSDictCursor SSCursor
# 02.使用 cursor() 方法创建一个游标对象 cursor
cursor.description#返回游标活动状态
# 03.使用 execute() 方法执行 SQL 查询
# 04.使用 fetchone() 方法获取单条数据. fetchone() 方法获取单条数据, 使用fetchall() 方法获取多条数据
# 05.关闭数据库连接 db.close()
示例代码
# 安装 pip install PyMySQL
import pymysql.cursors
# 连接数据库
connection = pymysql.connect(host='localhost',
user='user',
password='passwd',
db='db',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor)
try:
# #创建一个游标向服务器发送命令及接收结果
with connection.cursor() as cursor:
# 创建一条新的记录
sql = "INSERT INTO `users` (`name`, `age`) VALUES (%s, %d)"
cursor.execute(sql, ('webmaster@python.org', 'very-secret'))
# 连接完数据库并不会自动提交,所以需要手动 commit 你的改动 #强制提交
connection.commit()
with connection.cursor() as cursor:
# 读取单条记录
sql = "SELECT `id`, `password` FROM `users` WHERE `email`=%s"
cursor.execute(sql, ('python',))
result = cursor.fetchone()
print(result)
finally:
#关闭连接
connection.close()
with 结束后会自动 close cursor == cursor.close()
# 说明 --两种方式
# 使用 Python 的字符串操作来创建你的查询语句 不推荐使用这种,防止SQL注入
symbol = 'RHAT'
cursor.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol)
# 使用 ? 占位符来代替值,然后把对应的值组成的元组做为 execute() 方法的第二个参数
t = ('RHAT',)
cursor.execute('SELECT * FROM stocks WHERE symbol=?', t)
参考
sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块 https://docs.python.org/zh-cn/3/library/sqlite3.html
PEP 249 -- Python Database API Specification v2.0 https://www.python.org/dev/peps/pep-0249/
pymysql操作mysql详解 https://www.jianshu.com/p/1ba64df4fd15