本站以分享各种运维经验和运维所需要的技能为主
《python零基础入门》:python零基础入门学习
《python运维脚本》: python运维脚本实践
《shell》:shell学习
《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战
《k8》暂未更新
《docker学习》暂未更新
《ceph学习》ceph日常问题解决分享
《日志收集》ELK+各种中间件
《运维日常》运维日常
《linux》运维面试100问
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采用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()