day32
总结
Python程序接入MySQL数据库
~ 三方库:
- mysqlclient ---> C ---> 有可能会因为底层C语言的缺失而失败 ---> import MySQLdb
- pymysql ---> Python ---> 安装一定会成功 ---> import pymysql
except 指定的一场类型是父类型,那么可以捕获到子类型的异常
因为异常捕获需要遵循面向对象编程的里氏替换原则 (LSP)
- 创建Mysql账户,并授权以及回收权限
create user 'guest'@'%'
identified by 'Guest123';
grant create, alter, insert, update, select on hrs.* to 'guest'@'%' with grant option;
grant create, alter, insert, update, select on school.* to 'guest'@'%' with grant option;
grant all privileges on school.* to 'guest'@'%' with grant option;
grant all privileges on hrs.* to 'guest'@'%' with grant option;
grant drop on hrs.* to 'guest'@'%';
grant drop on school.* to 'guest'@'%';
grant drop on crawp.* to 'guest'@'%';
grant create on *.* to 'guest'@'%' with grant option;
revoke create on *.* from 'guest'@'%';
create database if not exists crawp default charset utf8mb4;
grant all privileges on crawp.* to 'guest'@'%' with grant option;
- 查看mysql执行计划
use hrs;
explain select eno, ename, job from tb_emp where eno=7800;
explain select eno, ename, job from tb_emp where ename='张三丰';
create index as idx_ename on hrs.tb_emp (ename);
- python连接数据库
- insert,update,delete
"""
!./env python
-*- coding: utf-8 -*-
@Time: 2021/6/10 10:44
@Author: 三玖天下第一
@File: example01.py
@Software: PyCharm
pip config set global.Index-url https://pypi.doubanio.com/simple
pip install pymysql
向关系型数据库的二维表中插入数据
"""
import pymysql
# 第一步: 建立数据库连接
# host - 主机,确定连接哪一台服务器, port - 端口,确定服务器上的端口
# user - 用户名, password - 密码, (提示:强烈建议不用root)
# database和charset - 连接数据库和使用的字符集
# autocommit - 自动提交
conn = pymysql.connect(host='10.7.174.55', port=3306, user='guest',
password='Guest123', database='hrs',
charset='utf8mb4', autocommit=False)
try:
try:
print('添加部门')
no = int(input('请输入编号:'))
name = input('请输入部门名称:')
location = input('请输入部门位置:')
# 第二步:获取游标对象
with conn.cursor() as cursor:
# 第三步:通过游标想数据库服务器发出SQL语句,获取执行结果
affected_rows = cursor.execute(
'insert into tb_dept(dno, dname, dloc) values (%s, %s, %s)',
(no, name, location)
)
# if conn.affected_rows() == 1:
if affected_rows == 1:
print('添加部门成功')
# 第四步:提交上面的操作
conn.commit()
except pymysql.MySQLError as err:
print('添加失败', f'错误提示:{err}')
# 第四步: 回滚(操作失败)
conn.rollback()
try:
no = int(input('请输入要删除部门的编号:'))
with conn.cursor() as cursor:
affected_rows = cursor.execute(
'delete from tb_dept where dno=%s',
no
)
if conn.affected_rows() == 1:
print(f'删除部门{no}成功...')
conn.commit()
except pymysql.MySQLError as err:
print('删除失败', f'错误提示{err}')
conn.rollback()
try:
no = int(input('请输入要修改部门的编号:'))
name = input('请输入修改后的部门名称:')
location = input('请输入修改后的部门位置:')
with conn.cursor() as cursor:
affected_rows = cursor.execute(
'update tb_dept set dname=%s,dloc=%s where dno=%s',
(name, location, no)
)
if affected_rows == 1:
print(f'更新部门{no}成功...')
conn.commit()
except pymysql.MySQLError as err:
print('更新失败', f'错误提示{err}')
conn.rollback()
finally:
# 第五步:关闭连接
conn.close()
- select
"""
!./env python
-*- coding: utf-8 -*-
@Time: 2021/6/10 14:06
@Author: 三玖天下第一
@File: example02.py
@Software: PyCharm
"""
import pymysql
import openpyxl
wb = openpyxl.Workbook()
sheet = wb.active
sheet.title = '部门信息'
sheet.append(['员工编号', '姓名', '职位', '隶属', '工资', '补贴', '部门名称', '部门所在位置', '部门编号'])
# 第一步: 连接到数据库
conn = pymysql.Connect(host='127.0.0.1', port=3306,
user='guest', password='Guest123',
database='hrs', charset='utf8mb4')
try:
try:
# 第二步: 获取游标对象
# 可设置读取数据是字典还是元组
# with conn.cursor(cursor=pymysql.cursors.DictCursor) as cursor:
with conn.cursor() as cursor:
# 第三步: 通过游标执行sql
cursor.execute(
'''SELECT t1.eno as 员工编号, t1.ename 姓名, t1.job 职位, t3.ename 隶属, t1.sal 工资, t1.comm 补贴,
dname 部门名称, dloc 部门所在位置, t1.dno 部门编号
FROM hrs.tb_emp t1 inner join hrs.tb_dept t2 on t1.dno=t2.dno
left join hrs.tb_emp t3 on t1.mgr=t3.eno'''
)
# 第四步: 通过游标获取数据
# cursor.fetchall() # 获取全部数据
# print(cursor.fetchone()) # 获取一行数据
# print(cursor.fetchmany(100)) # 获取100行数据
# 提示: 如果数据体量太大,fetchall最好不用,否则可能内存不足而崩溃,而且加载数据的时间也会特别长
# 迭代器
# for row in iter(lambda: cursor.fetchmany(2), []):
# print(row)
for row in cursor:
sheet.append(row)
except pymysql.MySQLError as err:
print(err)
finally:
wb.save(r'./file/hrs.xlsx')
wb.close()
conn.close()
- sql数据转excel
"""
从数据库中读取员工的编号、姓名、职位、月薪和部门名称,写入Excel文件
"""
import openpyxl
import pymysql
conn = pymysql.connect(host='10.7.174.103', port=3306,
user='guest', password='Guest.618',
database='hrs', charset='utf8mb4')
try:
with conn.cursor() as cursor:
cursor.execute(
'select eno, ename, job, sal, dname from tb_emp t1 '
'inner join tb_dept t2 on t1.dno=t2.dno'
)
wb = openpyxl.Workbook()
# ws = wb.create_sheet('员工表')
ws = wb.active
titles = ('工号', '姓名', '职位', '月薪', '部门')
# openpyxl操作Excel时,行和列的索引都是从1开始的
for col_idx, col_name in enumerate(titles):
ws.cell(1, col_idx + 1, col_name)
for row_idx, emp_row in enumerate(cursor.fetchall()):
for col_idx, col_value in enumerate(emp_row):
ws.cell(row_idx + 2, col_idx + 1, col_value)
wb.save('人力资源管理.xlsx')
except pymysql.MySQLError as err:
print(err)
finally:
conn.close()
- excel转sql数据
"""
从Excel文件中读取数据写入数据库
create database stock default character set utf8mb4;
use stock;
create table tb_baba_stock
(
stock_id bigint unsigned auto_increment comment '编号',
trade_date date not null comment '交易日',
high_price decimal(12, 4) not null comment '最高价',
low_price decimal(12, 4) not null comment '最低价',
open_price decimal(12, 4) not null comment '开盘价',
close_price decimal(12, 4) not null comment '收盘价',
trade_volume bigint unsigned not null comment '交易量',
primary key (stock_id)
);
"""
import openpyxl
import pymysql
wb = openpyxl.load_workbook('阿里巴巴2020年股票数据.xlsx')
ws = wb.active
params = []
for row_idx in range(2, ws.max_row + 1):
values = []
for col_idx in range(1, ws.max_column):
values.append(ws.cell(row_idx, col_idx).value)
params.append(values)
conn = pymysql.connect(host='10.7.174.103', port=3306,
user='guest', password='Guest.618',
database='stock', charset='utf8mb4')
try:
with conn.cursor() as cursor:
# 执行批量插入操作
cursor.executemany(
'insert into tb_baba_stock '
' (trade_date, high_price, low_price, open_price, close_price, trade_volume) '
'values '
' (%s, %s, %s, %s, %s, %s)',
params
)
conn.commit()
except pymysql.MySQLError as err:
print(err)
conn.rollback()
finally:
conn.close()
- example
"""
!./env python
-*- coding: utf-8 -*-
@Time: 2021/6/10 15:26
@Author: 三玖天下第一
@File: example_insert.py
@Software: PyCharm
excel 转sql
"""
import pymysql
import openpyxl
wb = openpyxl.load_workbook(r'./file/阿里巴巴2020年股票数据.xlsx')
ws = wb.active
row_iter = ws.iter_rows()
conn = pymysql.Connect(host='127.0.0.1', port=3306,
user='guest', password='Guest123',
database='crawp', charset='utf8mb4')
def insertmany():
try:
with conn.cursor() as cursor:
next(row_iter)
ws_data = []
def execute_sql():
cursor.executemany(
'''insert into tb_alidata(ali_date, ali_hight, ali_low, ali_open, ali_close, ali_volume, ali_adj_close) values(%s,%s,%s,%s,%s,%s,%s)''',
ws_data
)
index = 0
for row_data in row_iter:
index += 1
ws_data.append([cell.value for cell in row_data])
if index >= 100:
index = 0
execute_sql()
ws_data.clear()
execute_sql()
conn.commit()
except pymysql.MySQLError as err:
print(err)
conn.rollback()
def insert1():
try:
with conn.cursor() as cursor:
titles = next(row_iter)
for row_data in row_iter:
row_values = [cell.value for cell in row_data]
cursor.execute(
'''insert into tb_alidata(ali_date, ali_hight, ali_low, ali_open, ali_close, ali_volume, ali_adj_close) values(%s,%s,%s,%s,%s,%s,%s)''',
row_values
)
conn.commit()
except pymysql.MySQLError as err:
print(err)
conn.rollback()
if __name__ == '__main__':
try:
insertmany()
finally:
conn.close()
"""
!./env python
-*- coding: utf-8 -*-
@Time: 2021/6/10 18:32
@Author: 三玖天下第一
@File: example_insert_csv.py
@Software: PyCharm
csv 转 sql
"""
import pymysql
import csv
f = open(r'./file/jd2.csv', 'r', newline='', encoding='utf-8')
reader = csv.reader(f)
conn = pymysql.Connect(host='127.0.0.1', port=3306,
user='guest', password='Guest123',
database='crawp', charset='utf8mb4')
def insertmany():
try:
with conn.cursor() as cursor:
def execute_sql(data):
cursor.executemany(
'''insert into tb_nb_computer(title, detail, img, price, comment_num, comment_url, business, tags) values(%s,%s,%s,%s,%s,%s,%s,%s)''',
data
)
next(reader)
temp_data = []
index = 0
for row_data in reader:
temp_data.append(row_data)
if index >= 1:
index = 0
execute_sql(temp_data)
temp_data.clear()
if temp_data:
execute_sql(temp_data)
conn.commit()
except pymysql.MySQLError as err:
print(err)
conn.rollback()
if __name__ == '__main__':
try:
insertmany()
finally:
f.close()
conn.close()