目录
1. pymysql 概述
- Python 的数据库接口标准是 Python DB-API
- PyMySQL 是从 Python 连接到 MySQL 数据库服务器的接口
- PyMySQL 的目标是成为 MySQLdb 的替代品
- 官方文档:http://pymysql.readthedocs.io/
2. pymysql 安装
-
使用 pip 安装
pip install pymysql
-
使用 Pycharm 界面安装
3. pymysql 连接数据库
3.1 pymysql 连接数据库
- host:MySQL 服务器地址
- user:用户名
- password:密码
- database:数据库名称
- charset:编码方式,推荐使用 utf8mb4
# 1.导入库
import pymysql
# 2.建立连接
conn = pymysql.connect(host='服务器地址',
user='用户名',
password='密码',
database='数据库名',
charset="utf8mb4")
# 3.关闭连接
conn.close()
3.2 封装获取连接的函数
由于mysql的连接操作使用比较频繁,所以可以封装成一个数据库连接函数,并放置在__init__.py中。
#__init__.py
import pymysql
# 1.封装建立连接的对象
def get_conn():
conn = pymysql.connect(
host="服务器地址",
user="root",
password="123456",
database="数据库名",
charset="utf8mb4"
)
return conn
4. pymysql 入门实例
- 获取连接对象
- 打开
- 关闭
- 获取游标对象
- 执行 SQL
- 查询记录
from st_pymysql import get_conn
def demo():
# 1.获取连接对象
conn = get_conn()
# 2.获取游标对象
cursor = conn.cursor()
# 3.执行SQL
cursor.execute("SELECT VERSION()")
# 4.查询结果
version = cursor.fetchone()
print(f"数据库的版本是:{version}")
# 5.关闭连接
conn.close()
if __name__ == '__main__':
demo()
实际操作时,使用ip地址访问数据库报错:host ‘‘ is not allowed to connect to this mysql server
解决办法:在终端中按照以下步骤输入命令:
mysql -u root -p;
说明:根据自己的用户名来输入正确的用户,此处我的用户是root
use mysql;
select t.host from user t where t.user=‘root’;
查看mysql.user 中 root用户的host是什么,可以不用执行。
update user set host = ‘%’ where user = ‘root’;
FLUSH PRIVILEGES;
说明:是修改在不重启mysql服务的情况下立即生效。
5. pymysql 数据库操作
5.1 CRUD 操作
5.1.1 创建表
创建表 testcase
from st_pymysql import get_conn
def createtable_demo():
conn = get_conn() # 获取连接
cursor = conn.cursor() # 获取游标
sql = """
CREATE TABLE `testcase` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) COLLATE utf8_bin NOT NULL,
`expect` varchar(255) COLLATE utf8_bin NOT NULL,
`owner` varchar(255) COLLATE utf8_bin NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
"""
cursor.execute(sql) # 执行SQL
conn.close() # 关闭连接
if __name__ == '__main__':
createtable_demo()
创建结果:
5.1.2 插入记录
from st_pymysql import get_conn
def insert_demo():
conn = get_conn() # 获取连接
cursor = conn.cursor() # 获取游标
sql = """INSERT INTO testcase
(id, title, expect, owner)
values (1, 'S11总决赛', '冠军', 'EDG');
"""
cursor.execute(sql) # 执行SQL
conn.commit() # 提交
if __name__ == '__main__':
insert_demo()
执行前:表中没有数据
执行后:
5.1.3 查询记录
查询操作:
fetchone()
:获取单条记录fetchmany(n)
:获取 n 条记录fetchall()
:获取所有结果记录
import sys
from st_pymysql import get_conn
def demo():
conn = get_conn() # 获取连接
cursor = conn.cursor() # 获取游标
sql = "SELECT * FROM testcase;"
# 捕获异常
try:
cursor.execute(sql) # 执行SQL
record = cursor.fetchone() # 查询记录
print(record)
except Exception as e:
print(sys.exc_info()) # 打印错误信息
finally:
conn.close() # 关闭连接
if __name__ == '__main__':
demo()
"""
执行结果:
(1, 'S11总决赛', '冠军', 'EDG')
"""
5.2 执行事务
-
提交:commit
向数据库发出信号,完成变更,并且在操作后不再进行其他更改。
-
回滚:rollback
对一个或者多个的变更不满意,可以使用回滚还原回去。
-
try-catch-finally
from st_pymysql import get_conn
def demo():
conn = get_conn() # 获取连接
cursor = conn.cursor() # 获取游标
sql = """INSERT INTO testcase
(id, title, expect, owner)
values (2, 'S11全球总决赛', '冠军', 'EDG');
"""
try:
cursor.execute(sql) # 执行SQL
conn.commit() # 提交事务
except:
conn.rollback() # 回滚事务
finally:
conn.close() # 关闭连接
if __name__ == '__main__':
demo()
运行结果:
5.2.1 更新记录
更新数据表的数据
from st_pymysql import get_conn
def demo():
conn = get_conn()
cursor = conn.cursor()
sql = "UPDATE testcase SET owner='hogwarts' WHERE id=2;"
try:
cursor.execute(sql) # 执行SQL
conn.commit() # 提交事务
except:
conn.rollback() # 回滚事务
finally:
conn.close() # 关闭连接
if __name__ == '__main__':
demo()
运行结果:
5.2.2 删除记录
删除数据表的数据
from st_pymysql import get_conn
def demo():
conn = get_conn() # 获取连接
cursor = conn.cursor() # 获取游标
sql = "DELETE FROM testcase WHERE id=3;"
try:
cursor.execute(sql) # 执行SQL
conn.commit() # 提交事务
except:
conn.rollback() # 回滚事务
finally:
conn.close() # 关闭连接
if __name__ == '__main__':
demo()