• 【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确认

    - 关闭

    连接数据库

    1. import pymysql
    2. #创建链接
    3. conn=pymysql.connect(
    4. host='192.168.1.100',
    5. port=3306,
    6. user='root',
    7. passwd='123qqq...A',
    8. db='nsd1907',
    9. charset='utf8')
    10. #创建游标
    11. cur = conn.cursor()
    12. # 编写SQL语句
    13. create_dep = """CREATE TABLE departments(
    14. dep_id INT, dep_name VARCHAR(20),
    15. PRIMARY KEY(dep_id)
    16. )"""
    17. create_emp = """CREATE TABLE employees(
    18. emp_id INT, emp_name VARCHAR(20), birth_date DATE,
    19. email VARCHAR(50), dep_id INT,
    20. PRIMARY KEY(emp_id),
    21. FOREIGN KEY(dep_id) REFERENCES departments(dep_id)
    22. )"""
    23. create_sal = """CREATE TABLE salary(
    24. id INT, date DATE, emp_id INT,
    25. basic INT, awards INT,
    26. PRIMARY KEY(id),
    27. FOREIGN KEY(emp_id) REFERENCES employees(emp_id)
    28. )"""
    29. # 执行SQL语句
    30. cur.execute(create_dep)
    31. cur.execute(create_emp)
    32. cur.execute(create_sal)
    33. # 确认提交
    34. conn.commit()
    35. # 关闭
    36. cur.close()
    37. conn.close()

    增删改查

    1. #增删改查
    2. import pymysql
    3. #创建链接
    4. conn=pymysql.connect(
    5. host='192.168.1.100',
    6. port=3306,
    7. user='root',
    8. passwd='123qqq...A',
    9. db='nsd1907',
    10. charset='utf8')
    11. #创建游标
    12. cur = conn.cursor()
    13. # # 创建部门
    14. # insert1 = "INSERT INTO departments VALUES(%s, %s)"
    15. # cur.executemany(insert1, [(1, '人事部')])
    16. # #cur.executemany(insert1, (1, '人事部'))
    17. #cur.executemany(insert1, [(2, '运维部'), (3, '开发部'), (4, '测试部')])
    18. # cur.executemany(insert1, [(4, '测试部'), (5, '市场部'), (6, '销售部')])
    19. #insert1 = "INSERT INTO departments VALUES(9, '人事部3'),(10,'人事部4')"
    20. #cur.execute(insert1)
    21. #更新部门,将人事部改为人力资源部
    22. # update1 = "UPDATE departments SET dep_name=%s WHERE dep_name=%s"
    23. # cur.execute(update1, ('人力资源部', '人事部'))
    24. # # 删除4号部门
    25. # del1 = "DELETE FROM departments WHERE dep_id=%s"
    26. # cur.execute(del1, (4,))
    27. #查询
    28. select1 = "SELECT * FROM departments"
    29. cur.execute(select1)
    30. result1 = cur.fetchone()#取一个记录
    31. print(result1)
    32. print('*' * 30)
    33. result2 = cur.fetchmany(2)#继续取两个记录
    34. print(result2)
    35. print('*' * 30)
    36. result3 = cur.fetchall()#取出剩余全部记录
    37. print(result3)
    38. # 执行SQL语句
    39. # cur.execute(create_dep)
    40. # cur.execute(create_emp)
    41. # cur.execute(create_sal)
    42. # 确认提交
    43. conn.commit()
    44. # 关闭
    45. cur.close()
    46. 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/*

     连接数据库

    1. mysql> CREATE DATABASE tedu1907 DEFAULT CHAR SET utf8;
    2. mysql> show grants for root@'192.168.1.%';
    3. dbconn.py:
    4. from sqlalchemy import create_engine,Column,Integer,String,Date,ForeignKey
    5. from sqlalchemy.ext.declarative import declarative_base
    6. from sqlalchemy.orm import sessionmaker
    7. # 创建到mysql数据库的连接引擎
    8. engine = create_engine(
    9.     'mysql+pymysql://root:123qqq...A@192.168.1.100/tedu1907?charset=utf8',
    10.     encoding = 'utf8',
    11.     #echo = True 屏幕上打印日志
    12. )
    13. #创建实体类的基类---固定必须要写
    14. Base = declarative_base()
    15. #创建到数据库连接的会话类
    16. Session = sessionmaker(bind=engine)
    17. #创建实体类,也就是创建表对应的类
    18. class Departments(Base):
    19.     __tablename__ = 'departments' #声明类对应的表
    20.     #每个字段都要用Column来定义
    21.     dep_id = Column (Integer,primary_key=True) #设置为主键
    22.     dep_name = Column (String(20),unique=True) #名称必须唯一
    23.      def __str__(self):         
    24.         return "部门: %s" % self.dep_name
    25. -----为后面的 print(hr)输出用
    26. class Employees(Base):
    27.     __tablename__ = 'employees'
    28.     emp_id = Column(Integer,primary_key=True)
    29.     emp_name = Column(String(20))
    30.     birth_date = Column(Date)
    31.     email = Column(String(50))
    32.     dep_id = Column(Integer,ForeignKey('departments.dep_id'))
    33. class Salary(Base):
    34.     __tablename__ = 'salary'
    35.     id = Column(Integer,primary_key=True)
    36.     date = Column(Date)
    37.     emp_id = Column(Integer,ForeignKey('employees.emp_id'))
    38.     basic = Column(Integer)
    39.     awards = Column(Integer)
    40. if __name__ == '__main__':
    41.     #如果库中无表则创建,有表将不会执行
    42.     Base.metadata.create_all(engine)

    增删改查

    1. #create / retrieve / update / delete
    2. from dbconn import Session,Departments,Employees
    3. #创建到数据库的会话连接
    4. session = Session()
    5. #插入数据
    6. hr = Departments(dep_id =1 ,dep_name = '人事部')
    7. ops = Departments(dep_id =2 , dep_name = '运维部' )
    8. dev = Departments(dep_id =3 ,dep_name = '开发部')
    9. qa = Departments(dep_id =4 ,dep_name = '测试部')
    10. sales = Departments(dep_id =5 ,dep_name = '销售部')
    11. market = Departments(dep_id =6 ,dep_name = '市场部')
    12. lb = Employees(
    13.     emp_id = 1 , emp_name = '刘备',
    14.     birth_date = '1982-3-15', email = 'lb@sg.com' ,dep_id = 1
    15. )
    16. km = Employees(
    17.     emp_id = 2 , emp_name = '孔明',
    18.     birth_date = '1982-3-15', email = 'km@sg.com' ,dep_id = 2
    19. )
    20. # session.add_all([hr,ops,dev,qa,sales,market,lb])
    21. #session.add_all([km])
    22. #session.add(单个)
    23. #查询部门,传入的是class,返回的是实例集合
    24. # qset1 = session.query(Departments)
    25. # print(qset1) #此时只是sql语句,取值时,才是真正连接数据库
    26. # print(qset1.all())
    27. # for dep in qset1:
    28. #     print(dep.dep_id,dep.dep_name)
    29. #查询员工,传入的是字段,返回的是由字段构成的元组
    30. # qset2 = session.query(Employees.emp_name,Employees.email)
    31. # print(qset2)
    32. # print(qset2.all())
    33. # for emp in qset2:
    34. #     print(emp)
    35. # print('*' * 30)
    36. # for name , email in qset2:
    37. #     print(name,email)
    38. #查询部门,按id排序
    39. # qset3 = session.query(Departments).order_by(Departments.dep_id)
    40. # for dep in qset3:
    41. #     print(dep.dep_id,dep.dep_name)
    42. #查询部门id是1的部门
    43. # qset4 = session.query(Departments).filter(Departments.dep_id==1)
    44. # for dep in qset4:
    45. #     print(dep.dep_id,dep.dep_name)
    46. #查询部门id是24的部门
    47. # qset5 = session.query(Departments)\
    48. #     .filter(Departments.dep_id>=2)\
    49. #     .filter(Departments.dep_id<=4)
    50. # for dep in qset5:
    51. #     print(dep.dep_id,dep.dep_name)
    52. #模糊查询:
    53. # qset6 = session.query(Employees.emp_name,Employees.email)\
    54. #     .filter(Employees.email.like('%@sg.com'))
    55. # for emp in qset6:
    56. #     print(emp.emp_name,emp.email)
    57. #多表查询: query查询的时候,先写Employees.emp_name,就要join Departments
    58. # qset7 = session.query(Employees.emp_name,Departments.dep_name)\
    59. #     .join(Departments)
    60. # qset7 = session.query(Departments.dep_name,Employees.emp_name)\
    61. #      .join(Employees)
    62. # for data in qset7:
    63. #     print(data)
    64. # 修改
    65. # qset9 = session.query(Departments)\
    66. #     .filter(Departments.dep_name=='人事部')
    67. # hr = qset9.first()  # 取出查询结果的第一项
    68. # print(hr)
    69. # hr.dep_name = '人力资源部'
    70. # 删除
    71. qset10 = session.query(Departments)\
    72.     .filter(Departments.dep_name=='销售部')
    73. sales = qset10[0]
    74. print(sales)
    75. session.delete(sales)
    76. #如果是增删改操作,需要确认commit
    77. session.commit()
    78. #关闭会话
    79. session.close()

  • 相关阅读:
    Android 集成Flutter模块踩坑之路
    ardupilot开发 --- External LEDs篇
    对MybatisPlus的Select和Update实现自定义Sql
    关于不同数据库的SQL中比较串的形式为NULL=NULL的返回值不同
    Yakit工具篇:子域名收集的配置和使用
    安卓期末大作业——仿番茄免费小说APP
    《图解Pandas》内容汇总-20220822
    KNN算法与SVM支持向量机
    什么是ajax,ajax有什么特点?
    云原生时代崛起的编程语言Go常用标准库实战
  • 原文地址:https://blog.csdn.net/zerotoall/article/details/134460037