【python零基础入门学习】python进阶篇之数据库连接-PyMysql-全都是干货-一起来学习吧!!!

  本站以分享各种运维经验和运维所需要的技能为主

《python零基础入门》:python零基础入门学习

《python运维脚本》: python运维脚本实践

《shell》:shell学习

《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战

《k8》暂未更新

《docker学习》暂未更新

《ceph学习》ceph日常问题解决分享

《日志收集》ELK+各种中间件

《运维日常》运维日常

《linux》运维面试100问

 python进阶篇之数据库连接-PyMysql

安装

python包官方站点:https://pypi.python.org

# pip install xxxx

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple mysql-connector-python-rf

在线安装,默认使用的是国外站站,也可以设置,使用国内镜像站点:

安装依赖包

[root@localhost packages]# yum install -y gcc

[root@room8pc16 day02]# mkdir ~/.pip/

[root@room8pc16 day02]# vim ~/.pip/pip.conf

[global]

index-url = http://pypi.douban.com/simple/

[install]

trusted-host=pypi.douban.com

### 本地安装:

注意:需要在虚拟环境中安装

# ls /linux-soft/05/

zzg_pypkgs.tar.gz

# tar xf zzg_pypkgs.tar.gz

# cd zzg_pypkgs

# pip install pymysql_pkgs/*

进入正文:数据库

数据库:

你正在为一个小型公司编写基础数数据库,数据库需要记录员工,部门和发工资的信息.

收集字段:姓名,性别,联系方式,部门,出生日期,工资日,底薪,奖金,实发工资

数据库范式:

数据库范式有第一范式、第二范式、第 三范式、巴斯-科德范式、第四范式、第五范式六种

所谓第一范式(1NF)是指在关系模型中,对域添加的一个规范要求,所有的域都应该是原>子性的,即数据库表的每一列都是不可分割的原子数据项。如联系方式不能成为一个字段,

需要将其拆分成家庭住址、电话号码、email等。

第二范式(2NF)是在第一范式(1NF) 的基础上建立起来的,即满足第二范式(2NF)必须

先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或记录必须 可以被>唯一地区分。简单来说就是每个表需要有个主键

员工表:员工ID、姓名、出生日期、email、部门ID

部门表:部门ID、部门名

工资表:id、工资日、员工ID、底薪、奖金、实发工资

第三范式(3NF)要求一个关系中不包含已在其它关系已包含的非主关键字信息。简单来说>,非主字段,不能依赖其他非主字段。实发工资是由底薪、奖金算出来的,所以它不应该出

现在数制库中。用的时候,应该是通过程序计算。

[root@room8pc16 day02]# mysql -uroot -ptedu.cn

MariaDB [(none)]> CREATE DATABASE nsd1907 DEFAULT CHAR SET utf8;

>grant all on *.* to root@'192.168.1.%' identified by '123qqq...A' ;

## pymsql操作数据库

- 连接

- 创建游标。游标就像是文件对象,通过文件对象可以对文件实施读写操作,通过游标就可

以对数据库进行增删改查。

- 执行SQL语句

- 如果执行的语句是增删改,必须commit确认

- 关闭

连接数据库

import pymysql

#创建链接
conn=pymysql.connect(
host='192.168.1.100',
port=3306,
user='root',
passwd='123qqq...A',
db='nsd1907',
charset='utf8')

#创建游标
cur = conn.cursor()

# 编写SQL语句
create_dep = """CREATE TABLE departments(
dep_id INT, dep_name VARCHAR(20),
PRIMARY KEY(dep_id)
)"""
create_emp = """CREATE TABLE employees(
emp_id INT, emp_name VARCHAR(20), birth_date DATE,
email VARCHAR(50), dep_id INT,
PRIMARY KEY(emp_id),
FOREIGN KEY(dep_id) REFERENCES departments(dep_id)
)"""
create_sal = """CREATE TABLE salary(
id INT, date DATE, emp_id INT,
basic INT, awards INT,
PRIMARY KEY(id),
FOREIGN KEY(emp_id) REFERENCES employees(emp_id)
)"""

# 执行SQL语句
cur.execute(create_dep)
cur.execute(create_emp)
cur.execute(create_sal)

# 确认提交
conn.commit()

# 关闭
cur.close()
conn.close()

增删改查

#增删改查

import pymysql

#创建链接
conn=pymysql.connect(
host='192.168.1.100',
port=3306,
user='root',
passwd='123qqq...A',
db='nsd1907',
charset='utf8')

#创建游标
cur = conn.cursor()

# # 创建部门
# insert1 = "INSERT INTO departments VALUES(%s, %s)"
# cur.executemany(insert1, [(1, '人事部')])
# #cur.executemany(insert1, (1, '人事部'))
#cur.executemany(insert1, [(2, '运维部'), (3, '开发部'), (4, '测试部')])
# cur.executemany(insert1, [(4, '测试部'), (5, '市场部'), (6, '销售部')])

#insert1 = "INSERT INTO departments VALUES(9, '人事部3'),(10,'人事部4')"
#cur.execute(insert1)


#更新部门,将人事部改为人力资源部
# update1 = "UPDATE departments SET dep_name=%s WHERE dep_name=%s"
# cur.execute(update1, ('人力资源部', '人事部'))

# # 删除4号部门
# del1 = "DELETE FROM departments WHERE dep_id=%s"
# cur.execute(del1, (4,))

#查询
select1 = "SELECT * FROM departments"
cur.execute(select1)
result1 = cur.fetchone()#取一个记录
print(result1)
print('*' * 30)
result2 = cur.fetchmany(2)#继续取两个记录
print(result2)
print('*' * 30)
result3 = cur.fetchall()#取出剩余全部记录
print(result3)

# 执行SQL语句
# cur.execute(create_dep)
# cur.execute(create_emp)
# cur.execute(create_sal)

# 确认提交
conn.commit()

# 关闭
cur.close()
conn.close()

游标

SQLAlchemy:

  • sqlalchemy采用ROM管理数据库

  • O:Object 对象

  • R:relational 关系

  • M: Mapping 映射

  • sqlalchemy 将一个class与数据中的一张表相关联

  • sqlalchemy将类变量与表的字段关联

  • sqlalchemy将数据库的各种数据类型定义成了相关的class

  • sqlalchemy将class的实例与表的记录关联

now( ) year( ) month( ) day( ) date( ) time( ) datetime curtime( ) curdate( )

安装

#安装

pip install sqlalchemy_pkgs/*

 连接数据库

mysql> CREATE DATABASE tedu1907 DEFAULT CHAR SET utf8;
mysql> show grants for root@'192.168.1.%';

dbconn.py:

from sqlalchemy import create_engine,Column,Integer,String,Date,ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
# 创建到mysql数据库的连接引擎
engine = create_engine(
    'mysql+pymysql://root:123qqq...A@192.168.1.100/tedu1907?charset=utf8',
    encoding = 'utf8',
    #echo = True 屏幕上打印日志

)

#创建实体类的基类---固定必须要写
Base = declarative_base()

#创建到数据库连接的会话类
Session = sessionmaker(bind=engine)


#创建实体类,也就是创建表对应的类
class Departments(Base):
    __tablename__ = 'departments' #声明类对应的表
    #每个字段都要用Column来定义
    dep_id = Column (Integer,primary_key=True) #设置为主键
    dep_name = Column (String(20),unique=True) #名称必须唯一

     def __str__(self):          
        return "部门: %s" % self.dep_name
-----为后面的 print(hr)输出用


class Employees(Base):
    __tablename__ = 'employees'
    emp_id = Column(Integer,primary_key=True)
    emp_name = Column(String(20))
    birth_date = Column(Date)
    email = Column(String(50))
    dep_id = Column(Integer,ForeignKey('departments.dep_id'))


class Salary(Base):
    __tablename__ = 'salary'
    id = Column(Integer,primary_key=True)
    date = Column(Date)
    emp_id = Column(Integer,ForeignKey('employees.emp_id'))
    basic = Column(Integer)
    awards = Column(Integer)


if __name__ == '__main__':
    #如果库中无表则创建,有表将不会执行
    Base.metadata.create_all(engine)


增删改查

#create / retrieve / update / delete
from dbconn import Session,Departments,Employees

#创建到数据库的会话连接
session = Session()


#插入数据
hr = Departments(dep_id =1 ,dep_name = '人事部')
ops = Departments(dep_id =2 , dep_name = '运维部' )
dev = Departments(dep_id =3 ,dep_name = '开发部')
qa = Departments(dep_id =4 ,dep_name = '测试部')
sales = Departments(dep_id =5 ,dep_name = '销售部')
market = Departments(dep_id =6 ,dep_name = '市场部')

lb = Employees(
    emp_id = 1 , emp_name = '刘备',
    birth_date = '1982-3-15', email = 'lb@sg.com' ,dep_id = 1
)

km = Employees(
    emp_id = 2 , emp_name = '孔明',
    birth_date = '1982-3-15', email = 'km@sg.com' ,dep_id = 2
)

# session.add_all([hr,ops,dev,qa,sales,market,lb])
#session.add_all([km])
#session.add(单个)


#查询部门,传入的是class,返回的是实例集合
# qset1 = session.query(Departments)
# print(qset1) #此时只是sql语句,取值时,才是真正连接数据库
# print(qset1.all())
# for dep in qset1:
#     print(dep.dep_id,dep.dep_name)

#查询员工,传入的是字段,返回的是由字段构成的元组
# qset2 = session.query(Employees.emp_name,Employees.email)
# print(qset2)
# print(qset2.all())
# for emp in qset2:
#     print(emp)
# print('*' * 30)
# for name , email in qset2:
#     print(name,email)


#查询部门,按id排序
# qset3 = session.query(Departments).order_by(Departments.dep_id)
# for dep in qset3:
#     print(dep.dep_id,dep.dep_name)

#查询部门id是1的部门
# qset4 = session.query(Departments).filter(Departments.dep_id==1)
# for dep in qset4:
#     print(dep.dep_id,dep.dep_name)

#查询部门id是2到4的部门
# qset5 = session.query(Departments)\
#     .filter(Departments.dep_id>=2)\
#     .filter(Departments.dep_id<=4)
# for dep in qset5:
#     print(dep.dep_id,dep.dep_name)


#模糊查询:
# qset6 = session.query(Employees.emp_name,Employees.email)\
#     .filter(Employees.email.like('%@sg.com'))
# for emp in qset6:
#     print(emp.emp_name,emp.email)


#多表查询: query查询的时候,先写Employees.emp_name,就要join Departments
# qset7 = session.query(Employees.emp_name,Departments.dep_name)\
#     .join(Departments)
# qset7 = session.query(Departments.dep_name,Employees.emp_name)\
#      .join(Employees)
# for data in qset7:
#     print(data)

# 修改
# qset9 = session.query(Departments)\
#     .filter(Departments.dep_name=='人事部')
# hr = qset9.first()  # 取出查询结果的第一项
# print(hr)
# hr.dep_name = '人力资源部'

# 删除
qset10 = session.query(Departments)\
    .filter(Departments.dep_name=='销售部')
sales = qset10[0]
print(sales)
session.delete(sales)





#如果是增删改操作,需要确认commit
session.commit()


#关闭会话
session.close()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/160595.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Springboot+vue的学生成绩管理系统(有报告),Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的学生成绩管理系统&#xff08;有报告&#xff09;&#xff0c;Javaee项目&#xff0c;springboot vue前后端分离项目。 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家…

Windows11 python3.12 安装pyqt6 pyqt6-tools

Windows11 python3.12 安装pyqt6比较容易&#xff0c;但pyqt6-tools一直安装不上去。出错信息如下&#xff1a; (venv) PS D:\python_project\pyqt6> pip install pyqt6-tools Collecting pyqt6-toolsUsing cached pyqt6_tools-6.4.2.3.3-py3-none-any.whl (29 kB) Collec…

《少儿编程启蒙指南》

《少儿编程启蒙指南》大纲 本文详细阐述少儿编程启蒙&#xff0c;如果有人喜欢&#xff0c;往后我会继续更新迭代此文。 “Everyone should know how to program a computer, because it teaches you how to think.”—Steve Jobs 每个人都应该知道如何编程&#xff0c;因为它…

杭州信息安全

更轻量级的用户开销 (Lower online burden) 更灵活的通信模型 (Flexible metadata-private messaging) 一对一通信 >多对一、一对多通信 Group messaging Broadcast / anycast 元数据隐私保护技术在其他系统的推广

RocketMQ(二):原生API快速入门

RocketMQ系列文章 RocketMQ(一)&#xff1a;基本概念和环境搭建 RocketMQ(二)&#xff1a;原生API快速入门 目录 一、RocketMQ快速入门1、生产者发送消息2、消费者接受消息3、代理者位点和消费者位点 二、消费模型特点1、同一个消费组的不同消费者&#xff0c;订阅主题必须相…

Python每日一练@前言

Python每日一练前言 导读 人生苦短&#xff0c;我用Python 大家好&#xff0c;我是鹅不糊涂 欢迎大家来到Python每日一练 好处 加强编程能力: 每日一练可以帮助提升编程技能&#xff0c;通过解决各种编程问题和挑战&#xff0c;你能够不断锻炼自己的逻辑思维和解决问题的能力…

不允许你还没有了解哈希表、哈希桶、哈希冲突的解决,如何避免冲突

✏️✏️✏️今天给各位带来的是哈希桶、哈希冲突方面的知识。 清风的CSDN博客 &#x1f61b;&#x1f61b;&#x1f61b;希望我的文章能对你有所帮助&#xff0c;有不足的地方还请各位看官多多指教&#xff0c;大家一起学习交流&#xff01; 动动你们发财的小手&#xff0c;点…

实用篇-ES-DSL查询文档

数据的存储不是目的&#xff0c;我们希望从海量的酒店数据中检索出需要的信息&#xff0c;这就是ES的搜索功能 官方文档: https://elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html#query-dsl。DSL是用来查询文档的 Elasticsearch提供了基于JSON的DSL来定…

vite vue3配置eslint和prettier以及sass

准备 教程 安装eslint 官网 vue-eslint ts-eslint 安装eslint yarn add eslint -D生成配置文件 npx eslint --init安装其他插件 yarn add -D eslint-plugin-import eslint-plugin-vue eslint-plugin-node eslint-plugin-prettier eslint-config-prettier eslint-plugin…

【数据结构】图的存储结构及实现(邻接表和十字链表)

一.邻接矩阵的空间复杂度 假设图G有n个顶点e条边&#xff0c;则存储该图需要O&#xff08;n^2) 不适用稀疏图的存储 二.邻接表 1.邻接表的存储思想&#xff1a; 对于图的每个顶点vi&#xff0c;将所有邻接于vi的顶点链成一个单链表&#xff0c;称为顶点vi的边表&#xff08…

C/C++ 运用VMI接口查询系统信息

Windows Management Instrumentation&#xff08;WMI&#xff09;是一种用于管理和监视Windows操作系统的框架。它为开发人员、系统管理员和自动化工具提供了一种标准的接口&#xff0c;通过这个接口&#xff0c;可以获取有关计算机系统硬件、操作系统和应用程序的信息&#xf…

PS学习笔记——新建文档/修改文档

文章目录 新建文档文档属性像素/分辨率颜色模式背景内容高级选项存储预设 修改文档 新建文档 方法一&#xff1a;ctrlN快捷键可直接打开新建文档界面 方法二&#xff1a;点击菜单栏中 文件->新建&#xff0c;即可打开新建文档界面 文档参数可按需调节(标题可以提前设定或者…

face_recognition:高准确率、简单易用的人脸识别库 | 开源日报 No.79

ageitgey/face_recognition Stars: 49.8k License: MIT 这个项目是一个使用 Python 编写的人脸识别库&#xff0c;可以从图片中识别和操作人脸。它基于 dlib 开发&#xff0c;并采用深度学习技术构建了最先进的人脸识别模型&#xff0c;在 Labeled Faces in the Wild 数据集上…

Redis(消息队列Stream)

Stream是一个轻量级的消息队列。 Redis中Stream的作用是提供一种高效的消息传递机制&#xff0c;允许多个消费者并行地消费消息&#xff0c;并且不会重复消费已经处理过的消息。它可以用于实现分布式任务队列、日志收集、实时数据处理等场景。Redis中的Stream支持多个消费者组…

Python数据分析实战① Python实现数据可视化

文章目录 一、数据可视化介绍二、matplotlib和pandas画图1.matplotlib简介和简单使用2.matplotlib常见作图类型3.使用pandas画图4.pandas中绘图与matplotlib结合使用 三、订单数据分析展示四、Titanic灾难数据分析显示 一、数据可视化介绍 数据可视化是指将数据放在可视环境中…

6.2 List和Set接口

1. List接口 List接口继承自Collection接口&#xff0c;List接口实例中允许存储重复的元素&#xff0c;所有的元素以线性方式进行存储。在程序中可以通过索引访问List接口实例中存储的元素。另外&#xff0c;List接口实例中存储的元素是有序的&#xff0c;即元素的存入顺序和取…

【Linux网络编程】高级I/O

目录 五种I/O模型 阻塞和非阻塞 非阻塞I/O I/O多路复用之Select、Poll、与Epoll 本文目的是深入浅出理解高级I/O相关的知识&#xff0c;结尾附上代码加深理解相关知识。 五种I/O模型 1.阻塞I/O&#xff1a;在内核将数据准备好之前&#xff0c;系统调用会一直等待。所有的套…

【踩坑笔记】国科GK7202V300芯片开发常见问题解决办法

国科Linux芯片开发常见问题&解决办法 0.读前须知 不管什么时候&#xff0c;下载程序还是啥&#xff0c;一定要检查路径&#xff01;&#xff01;&#xff01;别问我为什么&#xff0c;呜呜呜~ tips&#xff1a;该芯片是仿造海思的产品&#xff0c;所以&#xff0c;有些不…

cp: can‘t stat ‘/usr/share/zoneinfo/Asia/Shanghai‘: No such file or directory

目录 问题描述问题分析解决方案容器时区验证 问题描述 使用下面的 Dockerfile 为 youlai-boot 项目制作镜像设置容器时区报错。 # 基础镜像 FROM openjdk:17-jdk-alpine # 时区修改 RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \&& echo Asia/Sha…

【每周一测】Java阶段三阶段考试

目录 1、SpringBoot在整合RabbitMQ时需要导入的包是 2、下列关于RabbitMQ的confirm消息确认机制解释说明正确的是 3、关于SpringBoot的配置文件&#xff0c;以下说法正确的是&#xff08;&#xff09; 4、变量命名规范说法正确的是? 5、哪个关键字可以对对象加互斥锁&…