十五python操作mysql数据库------非orm(代码片段)

AmoXiang AmoXiang     2023-03-15     709

关键词:

文章目录

前置知识:

一、数据库开发与实战专栏导学及数据库基础概念入门
二、MySQL 介绍及 MySQL 安装与配置
三、MySQL 数据库的基本操作
四、MySQL 存储引擎及数据类型
五、数据导入与基本的 SELECT 语句
六、MySQL 数据库练习题1(包含前5章练习题目及答案)
七、MySQL 多表查询详解(附练习题及答案----超详细)
八、MySQL 常用函数汇总(1)
九、MySQL 常用函数汇总(2)
十、MySQL 聚合函数、分组查询及过滤分组
十一、子查询详解
十二、创建和管理表
十三、表数据的增、删、改操作
十四、MySQL 约束详解

一、MySQL 官方驱动模块 — MySQL Connector

MySQL ConnectorMySQL 官方的驱动模块,兼容性特别好。官方地址: https://dev.mysql.com/downloads/connector/python/ Windows 下载安装即可,Linux 系统下载 RPM 安装包,也可以使用 pip 进行安装,命令如下:

# Linux 系统下我使用的python版本是python3.8
pip3/pip install mysql-connector-python

1.1 连接数据库

# -*- coding: utf-8 -*-
# @Time    : 2023-02-22 23:10
# @Author  : AmoXiang
# @File    : demo1.py
# @Software: PyCharm
# @Blog    : https://blog.csdn.net/xw1680


import mysql.connector

# 第一种连接方式
# conn = mysql.connector.connect(host="127.0.0.1", port=3306, user="root",
#                                password="123456", database="mysql_study")
# conn.close()


# 第二种连接方式: 使用配置的方式连接
config = 
    "host": "127.0.0.1",
    "port": 3306,
    "user": "root",
    "password": "123456",
    "database": "mysql_study",

conn = mysql.connector.connect(**config)
# 查询数据
sql = "SELECT grade_level,lowest_sal,highest_sal FROM job_grades;"
# 游标(Cursor): MySQL Connector里面的游标用来执行SQL语句,而且查询的结果集也会保存在游标之中
cursor = conn.cursor()
cursor.execute(sql)
for row in cursor:
    print(row[0], row[1], row[2])
conn.close()

1.2 实战:SQL注入攻击案例

由于 SQL 语句是解释型语言,所以在拼接 SQL 语句的时候,容易被注入恶意的 SQL 语句,示例如下:

# -*- coding: utf-8 -*-
# @Time    : 2023-02-23 6:10
# @Author  : AmoXiang
# @File    : demo2.py
# @Software: PyCharm
# @Blog    : https://blog.csdn.net/xw1680

import mysql.connector

# 连接
config = 
    "host": "localhost",
    "port": 3306,
    "user": "root",
    "password": "123456",
    "database": "mysql_study"


conn = mysql.connector.connect(**config)
cursor = conn.cursor()
# SQL 语句
username = "1 OR 1=1"
password = "1 OR 1=1"
# SQL 拼接的第一种方式
sql1 = "SELECT COUNT(*) FROM t_user WHERE username=" + username + \\
       " AND AES_DECRYPT(UNHEX(password),'HelloWorld')=" + password + ";"
# print(sql1)
# cursor.execute(sql1)
# print(cursor.fetchone()[0])
# SQL 拼接使用格式化字符串
sql2 = f"SELECT COUNT(*) FROM t_user WHERE username=username AND " \\
       f"AES_DECRYPT(UNHEX(password),'HelloWorld')=password;"
print(sql2)
cursor.execute(sql2)
print(cursor.fetchone()[0])
# 注意: 使用该种sql拼接不会引起sql注入
sql3 = f"SELECT COUNT(*) FROM t_user WHERE username='username' AND " \\
       f"AES_DECRYPT(UNHEX(password),'HelloWorld')='password';"

conn.close()

解决方案:

# -*- coding: utf-8 -*-
# @Time    : 2023-02-23 6:10
# @Author  : AmoXiang
# @File    : demo2.py
# @Software: PyCharm
# @Blog    : https://blog.csdn.net/xw1680

import mysql.connector

# 连接
config = 
    "host": "localhost",
    "port": 3306,
    "user": "root",
    "password": "123456",
    "database": "mysql_study"


conn = mysql.connector.connect(**config)
cursor = conn.cursor()
# SQL 语句
username = "1 OR 1=1"
password = "1 OR 1=1"
# 使用%s占位符
sql = "SELECT COUNT(*) FROM t_user WHERE username=%s AND AES_DECRYPT(UNHEX(password),'HelloWorld')=%s;"
print(sql)
# execute 第二个参数为元组 如果只传入一个值 别忘记加, 例如(username,)
# 预编译SQL就是数据库提前把SQL语句编译成二进制,这样反复执行同一条SQL语句的效率就会提升
# SQL语句编译的过程中,关键字已经被解析过了,所以向编译后的SQL语句传入参数,都被当做字符串处理,
# 数据库不会解析其中注入的SQL语句
cursor.execute(sql, (username, password))
print(cursor.fetchone()[0])
conn.close()

1.3 MySQL Connector 的事务及异常处理

事务控制: Connector 为我们提供了非常简单的事务控制函数。

# -*- coding: utf-8 -*-
# @Time    : 2023-02-23 7:00
# @Author  : AmoXiang
# @File    : demo3.py
# @Software: PyCharm
# @Blog    : https://blog.csdn.net/xw1680

import mysql.connector

# 连接
config = 
    "host": "localhost",
    "port": 3306,
    "user": "root",
    "password": "123456",
    "database": "mysql_study"

try:
    conn = mysql.connector.connect(**config)
    conn.start_transaction()  # 开启事务
    cursor = conn.cursor()
    # SQL 语句 使用%s占位符
    sql = "INSERT INTO dept(did,dname) VALUES(%s,%s);"
    print(sql)
    cursor.execute(sql, (1005, "人事部"))  # 无返回值
    # 提交事务
    conn.commit()
except Exception as e:
    print(e)
    if "conn" in dir():
        conn.rollback()
finally:
    if "conn" in dir():
        conn.close()

1.4 数据库连接池技术

数据库连接的昂贵之处: 数据库连接是一种关键的、有限的、昂贵的资源,在并发执行的应用程序中体现得尤为突出。TCP 连接需要三次握手,四次挥手,然后数据库还要验证用户信息。

数据库连接池的意义: 数据库连接池( Connection Pool) 预先创建出一些数据库连接然后缓存起来,避免了程序语言反复创建和销毁连接昂贵代价。

示例如下:

# -*- coding: utf-8 -*-
# @Time    : 2023-02-23 7:20
# @Author  : AmoXiang
# @File    : demo4.py
# @Software: PyCharm
# @Blog    : https://blog.csdn.net/xw1680

import mysql.connector.pooling

# 连接
config = 
    "host": "localhost",
    "port": 3306,
    "user": "root",
    "password": "123456",
    "database": "mysql_study"

try:
    pool = mysql.connector.pooling.MySQLConnectionPool(**config, pool_size=10)
    # 从连接池中取出链接
    conn = pool.get_connection()
    conn.start_transaction()  # 开启事务
    cursor = conn.cursor()
    # SQL 语句 使用%s占位符
    sql = "UPDATE dept SET did=%s  WHERE dname=%s;"
    print(sql)
    cursor.execute(sql, (1006, "人事部"))  # 无返回值
    # 提交事务
    conn.commit()
except Exception as e:
    print(e)
    if "conn" in dir():
        conn.rollback()

1.5 MySQL Connector 删除数据

# -*- coding: utf-8 -*-
# @Time    : 2023-02-26 3:05
# @Author  : AmoXiang
# @File    : demo5.py
# @Software: PyCharm
# @Blog    : https://blog.csdn.net/xw1680

import mysql.connector

# 数据库连接配置
config = 
    "host": "localhost",
    "port": 3306,
    "user": "root",
    "password": "123456",
    "database": "mysql_study"


try:
    pool = mysql.connector.pooling.MySQLConnectionPool(**config, pool_size=10)
    # 从连接池中取出连接
    conn = pool.get_connection()

    # TODO 1. 使用delete from 删除表中数据
    # conn.start_transaction()  # 开启事务
    # cursor = conn.cursor()
    # 删除表中数据
    # sql = "DELETE e,d FROM t_emp e JOIN t_dept d ON e.deptno=d.deptno WHERE d.deptno=20;"
    # cursor.execute(sql)
    # conn.commit()

    # TODO 2. 使用 truncate table 清空表 不用开启事务与提交事务
    cursor = conn.cursor()
    sql = "TRUNCATE TABLE t_emp;"
    cursor.execute(sql)
except Exception as e:
    if "conn" in dir():
        conn.rollback()
    print(e)

1.6 MySQL Connector 多条数据插入

循环执行 SQL 语句: 游标对象中的 executemany() 函数可以反复执行一条 SQL 语句。

# -*- coding: utf-8 -*-
# @Time    : 2023-02-26 3:30
# @Author  : AmoXiang
# @File    : demo6.py
# @Software: PyCharm
# @Blog    : https://blog.csdn.net/xw1680

import mysql.connector.pooling

# 数据库连接配置
config = 
    "host": "localhost",
    "port": 3306,
    "user": "root",
    "password": "123456",
    "database": "mysql_study"


try:
    pool = mysql.connector.pooling.MySQLConnectionPool(**config, pool_size=10)
    con = pool.get_connection()
    con.start_transaction()  # 开启事务
    cursor = con.cursor()
    sql = "INSERT INTO t_dept(deptno,dname,loc) VALUES(%s,%s,%s);"
    data = [
        [100, "A部门", "北京"],
        [110, "B部门", "上海"],
    ]
    cursor.executemany(sql, data)
    con.commit()
except Exception as e:
    if "con" in dir():
        con.rollback()
    print(e)

1.7 案例练习

1.7.1 练习一

使用 INSERT 语句把所在部门平均工资超过公司平均工资的员工信息导入到 t_emp_new 表里面,并且让这些员工隶属于 sales 部门。

# -*- coding: utf-8 -*-
# @Time    : 2023-03-03 6:59
# @Author  : AmoXiang
# @File    : demo7.py
# @Software: PyCharm
# @Blog    : https://blog.csdn.net/xw1680

import mysql.connector.pooling

"""
使用 INSERT 语句把所在部门平均工资超过公司平均工资的员工信息导入到 t_emp_new 表里面,并且让这些员工隶属于 sales 部门。
在 Python 程序中与SQL语句:将复杂的SQL语句拆分成简单的SQL语句进行执行,并将其查询的结果保存在变量中,得以复用。
"""

# 数据库连接配置
config = 
    "host": "localhost",
    "port": 3306,
    "user": "root",
    "password": "123456",
    "database": "mysql_study"


try:
    pool = mysql.connector.pooling.MySQLConnectionPool(**config, pool_size=10)
    conn = pool.get_connection()
    # 开启事务
    conn.start_transaction()
    cursor = conn.cursor()
    # 创建表
    sql = "CREATE TABLE IF NOT EXISTS t_emp_new LIKE t_emp;"
    cursor.execute(sql)
    # 查询出公司的平均工资
    sql = "SELECT AVG(sal) AS avg FROM t_emp;"
    cursor.execute(sql)
    temp = cursor.fetchone()
    avg = temp[0]
    print(avg)
    # 查询出部门平均工资
    sql = "SELECT deptno FROM t_emp GROUP BY deptno HAVING AVG(sal)>=%s;"
    cursor.execute(sql, [avg])
    temp = cursor.fetchall()
    zw_chr = ('%s, ' * len(temp)).strip()[:-1]
    # 插入数据
    sql = "INSERT INTO t_emp_new SELECT * FROM t_emp WHERE deptno IN(" + zw_chr + ")"
    cursor.execute(sql, [_[0] for _ in temp])
    print(sql)
    # 删除原表中的数据
    sql = "DELETE FROM t_emp WHERE deptno IN(" + zw_chr + ")"
    cursor.execute(sql, [_[0] for _ in temp])
    # 新表中的部门改为 "SALES"
    sql = "SELECT deptno FROM t_dept WHERE dname=%s;"
    cursor.execute(sql, ["SALES"])
    sales_deptno = cursor.fetchone()[0]  # 注意fetchone返回的是一个元组 要使用索引取出第1个元素
    sql = "UPDATE t_emp_new SET deptno=%s;"
    cursor.execute(sql, [sales_deptno])
    conn.commit()
except Exception as e:
    if "conn" in dir():
        conn.rollback()
    print(e)

1.7.2 练习2

编写一个 INSERT 语句向部门表插入两条记录,每条记录都在部门原有最大主键值的基础上 +10

# -*- coding: utf-8 -*-
# @Time    : 2023-03-03 8:14
# @Author  : AmoXiang
# @File    : demo8.py
# @Software: PyCharm
# @Blog    : https://blog.csdn.net/xw1680

import mysql.connector.pooling

"""
编写一个 INSERT 语句向部门表插入两条记录,每条记录都在部门原有最大主键值的基础上 +10
"""

# 数据库连接配置
config = 
    "host": "localhost",
    "port": 3306,
    "user": "root",
    "password": "123456",
    "database": "mysql_study"


try:
    pool = mysql.connector.pooling.MySQLConnectionPool(**config, pool_size=10)
    conn = pool.get_connection()
    # 开启事务
    conn.start_transaction()
    cursor = conn.cursor()
    sql = """INSERT INTO t_dept SELECT MAX(deptno)+10, %s, %s FROM t_dept
             UNION  SELECT MAX(deptno)+20, %s, %s FROM t_dept;"""
    cursor.execute(sql, ["A部门", "上海", "B部门", "北京"])
    conn.commit()
except Exception as e:
    if "conn" in dir():
        conn.rollback()
    print(e)

二、PyMySQL 操作数据库

Python 中使用 MySQL 建议使用的客户端库是 PyMySQL,跨平台性、兼容性更好。在开始之前,请确保已经安装好了 MySQL 数据库并且保证能够正常运行。此外还需要安装 PyMySQL 库:安装方法非常简单,执行如下命令即可:

pip install -i http://pypi.douban.com/simple --trusted-host pypi.douban.com PyMysql

2.1 连接数据库

# -*- coding: utf-8 -*-
# @Time    : 2023-03-09 12:55
# @Author  : AmoXiang
# @File    : 1.连接数据库.py
# @Software: PyCharm
# @Blog    : https://blog.csdn.net/xw1680

from pymysql import connect, Error

"""
使用pymysql连接数据库
"""

# 数据库的连接对象
conn = None
try:
    # 建立连接
    conn = connect(
        host='127.0.0.1',
        port=3306,
        user='root',
        password='',
        database='my_data_base'
    )
    print(conn)
    conn.close()
except Error as e:
    print('连接失败:'.format(e))
finally:
    try:
        # 关闭连接
        conn.close()
        print('数据库连接已关闭')
    except Exception as e:
        print('数据库连接关闭失败:'.format(e))

此外,connect() 函数还有两个常用参数设置,介绍如下:

  1. charset: utf8 用于设置 MySQL 字符集为 UTF-8
  2. cursorclass: pymysql.cursors.DictCursor 用于设置游标类型为字典类型,默认为元组类型。

2.2 PyMySQL 的基本使用

操作 MySQL 的基本流程为:连接 MySQL → 创建游标 → 执行 SQL 语句 → 关闭连接。

【示例1】连接数据库:

import pymysql
from pymysql import Error

try:
    """
    host:MySQL运行的host 即ip 本地localhost MySQL 在远程传入公网ip即可
    user: 用户名
    password: 密码
    port: 端口
    """
    db = pymysql.connect(host="localhost", user="root", password="123456", port=3306)
    cursor = db.cursor()
    cursor.execute("SELECT VERSION();")
    data = cursor.fetchone()
    print(f"Database version: data")  # Database version: ('8.0.30',)
    cursor.execute("CREATE DATABASE spiders DEFAULT CHARACTER SET utf8mb4;")
    db.close()
except Error as e:
    if "db" in dir():
        db.rollback()
    print(e)
finally:
    if "db" in dir():
        db.close()

【示例2】创建表:

# -*- coding: utf-8 -*-
# @Time    : 2023-03-09 13:14
# @Author  : AmoXiang
# @File    : 3.创建表.py
# @Software: PyCharm
# @Blog    : https://blog.csdn.net/xw1680

import pymysql

# 创建数据库后,需要指定在哪个数据库下进行操作 db: 数据库
db = pymysql.connect(host="localhost", user="root", password="123456", port=3306, db="spiders")
cursor = db.cursor()
sql = 'CREATE TABLE IF NOT EXISTS students(id VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, age INT NOT NULL, ' \\
      'PRIMARY KEY(id))'

cursor.execute(sql)
db.close()

【示例3】插入数据----初版。

# -*- coding: utf-8 -*-
# @Time    : 2023-03-09 13:15
# @Author  : AmoXiang
# @File    : 4.插入数据-初版.py
# @Software: PyCharm
# @Blog    : https://blog.csdn.net/xw1680

import pymysql

s_id = "20140041"
user = "Amo"
age = 18

db = pymysql.connect(host="localhost", user="root", password="123456", port=3306, db="spiders")
cursor = db.cursor()
sql = 'INSERT INTO students(id, name, age) VALUES(%s, %s, %s);'
try:
    cursor.execute(sql, (s_id, user, age))
    dblinux学习总结(七十五)非关系型数据库之memcached(代码片段)

一非关系型数据库非关系型数据库就是NoSQL,关系型数据库代表MySQL对于关系型数据库来说,是需要把数据存储到库、表、行、字段里,查询的时候根据条件一行一行地去匹配,当量非常大的时候就很耗费时间和资源,尤其是数... 查看详情

2018-08-22第三十五课(代码片段)

第三十五课非关系型数据库-redis目录九、redis介绍十、redis安装十一、redis持久化十二、redis数据类型十三、redis常用操作十四、redis操作键值十五、redis安全设置十六、redis慢查询日志十七、php安装redis扩展十八、redis存储session十九... 查看详情

mysql进阶(二十五)解决数据库noconnection问题

解决数据库NOCONNECTION问题前言   数据库版本类型:Mysql5.5   在应用程序连接数据库时,提示数据库连接失败。打开数据库查看,显示如下。    究其原因,是因为mysql服务出现了问题,重启mysql... 查看详情

《mysql入门教程》第36篇python访问mysql(代码片段)

本篇我们介绍如何利用PythonDBAPI连接和操作MySQL数据库,包括数据的增删改查操作、存储过程调用以及事务处理等。Python是一种高级、通用的解释型编程语言,以其优雅、准确、简单的语言特性,在云计算、Web开发、... 查看详情

《mysql入门教程》第36篇python访问mysql(代码片段)

本篇我们介绍如何利用PythonDBAPI连接和操作MySQL数据库,包括数据的增删改查操作、存储过程调用以及事务处理等。Python是一种高级、通用的解释型编程语言,以其优雅、准确、简单的语言特性,在云计算、Web开发、... 查看详情

python其实很简单第十五章文件操作

参考技术A在各种变量中保存的数据都是临时的,随着程序运行结束都会丢失。要做到数据长期有效,必须建立在磁盘中建立文件,将数据输入到文件中并保存。需要获取数据时需要打开文件读取。而我们自己建立的程序都是应... 查看详情

python3操作mysql数据库(代码片段)

阅读目录Python3中操作MySQL数据库操作MySQL导包第一步:打开数据库连接第二步:创建游标第三步:操作数据库1、创建表2、添加数据3、查询数据4、修改数据5、删除数据第四步:关闭游标,数据库连接示例Python3... 查看详情

第十五篇:javascript之dom操作

一、后台管理页面布局二、JavaScript函数三、eval以及时间操作四、JavaScript作用域五、JavaScript面向对象模型六、DOM选择器七、DOM事件操作八、DOM绑定事件的分离绑定方法  查看详情

听说❤️python可以操作mysql数据库❤️(代码片段)

听说❤️Python可以操作MySQL数据库❤️文章目录听说❤️Python可以操作MySQL数据库❤️一、模块的安装二、实例三、Python操作MySQL的具体操作1、创建数据库以及table2、连接数据库3、插入一条数据4、插入多条数据5、修改数据6、查... 查看详情

听说❤️python可以操作mysql数据库❤️(代码片段)

听说❤️Python可以操作MySQL数据库❤️文章目录听说❤️Python可以操作MySQL数据库❤️一、模块的安装二、实例三、Python操作MySQL的具体操作1、创建数据库以及table2、连接数据库3、插入一条数据4、插入多条数据5、修改数据6、查... 查看详情

ubuntu系统下,使用python操作mysql数据库(代码片段)

...置文件内容4.安装navicat软件5.使用navicat远程连接ubuntu系统数据库6.终端操作指令7.Python交互MySQL数据库8.connect(连接)和cursor(光标)查询远程数据库9.熟悉增删改操作1.安装MySQL安装服务端软件:sudoapt-geti 查看详情

第十五周java

内部类分为:静态内部类、非静态内部类成员内部类是外部类成员,可以调用外部类成员。外部类如何使用内部类的成员:创建类对象wai.neiwn=newwai().newnei();局部内部类:内部类可以访问外部类成员单例模式:构造方法私有接口... 查看详情

python蟒蛇操作的mysql数据库(代码片段)

查看详情

数据湖(十五):spark与iceberg整合写操作

Spark与Iceberg整合写操作一、INSERTINTO"insertinto"是向Iceberg表中插入数据,有两种语法形式:"INSERTINTOtblVALUES(1,"zs",18),(2,"ls",19)"、"INSERTINTOtblSELECT...",以上两种方式比较简单,这里不再详细记录。二、MERGEINTOIceberg"mergeinto"语法可以对... 查看详情

redis(十五)-jedis操作测试(代码片段)

您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦。💪🏻1.Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。Python从入门到精通❤️2.Python爬虫专栏,系统性的学习爬虫... 查看详情

redis(十五)-jedis操作测试(代码片段)

您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦。💪🏻1.Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。Python从入门到精通❤️2.Python爬虫专栏,系统性的学习爬虫... 查看详情

linux环境下python怎样操作mysql数据库

linux环境下python怎样操作mysql数据库呢?方法如下:首先在Linux环境下安装mysql-python1、下载mysql-python打开终端:cd/usr/localsudowget http://nchc.dl.sourceforge.net/sourceforge/mysql-python/MySQL-python-1.2.2.tar.gz官网地址:http://sourceforge.net/projects/m... 查看详情

掌握python操作mysql数据库

参考技术A本文Python操作MySQL数据库需要是使用到PyMySQL驱动Python操作MySQL前提是要安装好MySQL数据库并能正常连接使用,安装步骤详见下文。注意:安装过程我们需要通过开启管理员权限来安装,否则会由于权限不足导致无法安装... 查看详情