【Python】操作MySQL

一、Python 操作 Mysql的方式

Python 操作 Mysql 主要包含下面 3 种方式:

  • Python-MySql
    • Python-MySql 由 C 语法打造,接口精炼,性能最棒;但是由于环境依赖多,安装复杂,已停止更新,仅支持 Python2;
  • PyMysql
    • PyMysql 为替代 Python-Mysql 而生,纯 Python 语言编写的 Mysql 操作客户端,安装方便,支持 Python3;
  • SQLAlchemy
    • SQLAlchemy 是一个非常强大的 ORM 框架,不提供底层的数据库操作,主要是通过定义模型对应数据表结构,在 Python Web 编程领域应用广泛

由于 Python-MySql 不支持 Python3,所以本文只谈后 2 种操作方式
 

二、PyMysql

首先,使用 pip 安装依赖 ;

# 安装依赖
pip3 install pymysql

连接数据库,获取数据库连接对象及游标对象;


什么是游标

在 MySQL 中,存储过程或函数中的查询有时会返回多条记录,而使用简单的 SELECT 语句,没有办法得到第一行、下一行或前十行的数据,这时可以使用游标来逐条读取查询结果集中的记录。游标在部分资料中也被称为光标。

 

三、连接数据库

使用 pymysql 中的 connect() 方法,传入数据库的 HOST 地址、端口号、用户名、 密码、待操作数据库的名称,即可以获取数据库的连接对象;然后,再通过数据库连接对象,获取执行数据库具体操作的游标对象


【步骤】:

  • 导入pymysql包
  • 创建数据库链接对象
  • 创建游标对象 
    • 使用cursor() 方法
  • 执行增删改查操作
    • 使用execute()执行单条增删改查
    • 使用executemany()执行多条数据的增删改查
  • 执行完之后将连接对象提交
    • 使用commit()方法
  • 将连接对象关闭
    • 使用close()方法

我们对Class_Linux库中的students表进行增删改查操作:

        原始students表:da033f90b3ad4ae096d09a7efcff9dba.png

 

1)新增

新增包含新增单条数据和新增多条数据

对于单条数据的插入,只需要编写一条插入的 SQL 语句,然后作为参数执行上面游标对象的 execute(sql) 方法,最后使用数据库连接对象的 commit() 方法将数据提交到数据库中


新增单条数据

import pymysql


def connect_mysql():
    # 1、创建数据库链接对象
    mysql_db = pymysql.connect(host='192.168.198.142',
                               port=3306,
                               user='root',
                               password='Nebula@123',
                               database='Class_Linux')
    # 2、创建游标对象
    mysql_course = mysql_db.cursor()

    # 3、执行增删改查操作
    # 使用execute()执行单条增删改查
    mysql_course.execute('insert into students values(NULL,"李白",23,"男",176,1)')
    # 4、执行完之后提交
    mysql_db.commit()
    # 5、将连接对象关闭
    mysql_db.close()


if __name__ == '__main__':
    connect_mysql()

运行之后,去Linux中的students表查看是否插入成功:

95f9b63ac6e44a3bb4c9cfc1a52e82ee.png

插入成功! 


新增多条数据

使用执行游标对象的 executemany() 方法,传入插入的 SQL 语句及 位置变量列表, 可以实现一次插入多条数据


import pymysql


def connect_mysql():

    mysql_db = pymysql.connect(host='192.168.198.142',
                               port=3306,
                               user='root',
                               password='Nebula@123',
                               database='Class_Linux')

    mysql_course = mysql_db.cursor()
    
    # 使用位置变量传参
    insert_query = 'insert into students values(NULL,%s,%s,%s,%s,%s)'
    datas = [("杜甫", 24, "男", 176, 1), ("白居易", 23, "男", 176, 1), ("王安石", 23, "男", 176, 1)]

    # 插入多条数据
    mysql_course.executemany(insert_query, datas)
    mysql_db.commit()
    mysql_db.close()


if __name__ == '__main__':
    connect_mysql()

查询后,插入成功!

6afddc2ef28e4dfa9e98e50fbff519df.png

 

2)查询

查询分为三步,分别是:

  1. 通过游标对象执行具体的 SQL 语句
  2. 通过游标对象,获取到元组数据
  3. 遍历元组数据,查看结果

比如:查看数据表中所有的记录

import pymysql

def connect_mysql():
    mysql_db = pymysql.connect(host='192.168.198.142',
                               port=3306,
                               user='root',
                               password='Nebula@123',
                               database='Class_Linux')

    mysql_course = mysql_db.cursor()

    select_query = 'select * from students'
    mysql_course.execute(select_query)

    # 拿到students表中的的数据,每一条数据都以元组的形式嵌套在一个大元组里
    rows = mysql_course.fetchall()
    print(rows)
    # 打印结果
    for row in rows:
        id = row[0]
        name = row[1]
        age = row[2]
        print('id:', id,'name:',name,'age:',age)


if __name__ == '__main__':
    connect_mysql()

88be9236c74e459fa4b5bd28efb6e54b.png


如果需要按条件查询某一条记录,只需要修改 SQL 语句即可实现; 

import pymysql



def connect_mysql():
    mysql_db = pymysql.connect(host='192.168.198.142',
                               port=3306,
                               user='root',
                               password='Nebula@123',
                               database='Class_Linux')

    mysql_course = mysql_db.cursor()
    # 按id查询
    SQL_QUERY_WITH_CONDITION = "SELECT * FROM students WHERE id={};"
    # 输入数字几就查询那一条数据
    mysql_course.execute(SQL_QUERY_WITH_CONDITION.format(26))

    # 拿到students表中的的数据,每一条数据都以元组的形式嵌套在一个大元组里
    rows = mysql_course.fetchall()
    # 打印结果
    for row in rows:
        id = row[0]
        name = row[1]
        age = row[2]
        print('id:', id,'name:',name,'age:',age)


if __name__ == '__main__':
    connect_mysql()
1d3a918f7c6c4eb0b76bac05378bcb56.png
将查询数据改成交互式:
import pymysql



while True:
    user_input = int(input("请输入您想查询的用户id:"))
    def connect_mysql():
        mysql_db = pymysql.connect(host='192.168.198.142',
                                   port=3306,
                                   user='root',
                                   password='Nebula@123',
                                   database='Class_Linux')

        mysql_course = mysql_db.cursor()
        # 按id查询
        SQL_QUERY_WITH_CONDITION = "SELECT * FROM students WHERE id={};"
        mysql_course.execute(SQL_QUERY_WITH_CONDITION.format(user_input))

        # 拿到students表中的的数据,每一条数据都以元组的形式嵌套在一个大元组里
        rows = mysql_course.fetchall()
        # 打印结果
        for row in rows:
            id = row[0]
            name = row[1]
            age = row[2]
            print('id:', id,'name:',name,'age:',age)


    if __name__ == '__main__':
        # range(28)表示范围在28之内,不包括28
        if user_input in range(28):
            connect_mysql()
        else:
            print("您所输入的id号不正确,请重新输入!")

4c11c9bd40d0453aa2c3e829b474889e.png

 

3)更新

和 新增操作 类似,更新操作也是通过游标对象去执行更新的 SQL 语句,最后利用数 据库连接对象将数据真实更新到数据库中


【步骤】:

  1. 导包
  2. 创建连接对象
  3. 创建游标对象
  4. 执行语句
  5. 提交连接对象
  6. 关闭连接对象

# 1、导包
import pymysql


def connect_mysql():
    # 2、创建连接对象
    mysql_db = pymysql.connect(host='192.168.198.142',
                               port=3306,
                               user='root',
                               password='Nebula@123',
                               database='Class_Linux')
    # 3、创建游标对象
    mysql_course = mysql_db.cursor()
    update_query = 'update students set name="%s",age=%s WHERE id=%s'
    sql_update = update_query % ("王五五", 30, 27)
    # 4、执行语句
    mysql_course.execute(sql_update)
    # 5、提交连接对象
    mysql_db.commit()
    # 6、关闭连接对象
    mysql_db.close()


if __name__ == '__main__':
    connect_mysql()

修改之前:

a8cc932ba1c4454d94ae674c2c2ce557.png

修改之后:

ed77637323df47f085fc6004bb86805a.png

 

4)删除

删除操作同查询、新增操作类似,只需要变更 SQL 语句即可


【步骤】:

  1. 导包
  2. 创建连接对象
  3. 创建游标对象
  4. 执行语句
  5. 释放资源

# 1、导包
import pymysql


def connect_mysql():
    # 2、创建连接对象
    mysql_db = pymysql.connect(host='192.168.198.142',
                               port=3306,
                               user='root',
                               password='Nebula@123',
                               database='Class_Linux')
    # 3、创建游标对象
    mysql_course = mysql_db.cursor()

    # 删除(通过id去删除数据)
    delete_query = 'delete from students where id=%d'
    sql_delete = delete_query % (27)
    # 4、执行sql语句
    mysql_course.execute(sql_delete)
    # 5、释放资源
    mysql_db.commit()
    mysql_db.close()


if __name__ == '__main__':
    connect_mysql()

删除前:

214999f915ea4def9e98924f8d88e231.png

删除后: 021012a7ce964d5b8941200663060704.png

 

四、保存爬取到的数据到MySQL里

之前写的爬取飞卢网站的小说标题,作者,小说类型

import re
import requests

response = requests.get('https://b2.faloo.com/y_0_1.html')


def parse_url():
    # 标题
    div_text1 = re.findall(re.compile(r'<div class="TwoBox02_08">(.*?)</div>'), response.text)
    title_list = []
    for i in div_text1:
        title_list.append(re.findall(re.compile(r'<h1 class="fontSize17andHei" title="(.*?)">'), i)[
                              0])  # 加下标是为了去掉括号[],因为使用?取消贪婪匹配后每一个符合条件的都是列表形式,使用下标可以将每一个小列表中的字符串取出来
    # print(title_list)

    # 作者
    div_text2 = re.findall(re.compile(r'<div class="TwoBox02_09">(.*?)</div>'), response.text)
    author_list = []
    for i in div_text2:
        author_list.append(re.findall(re.compile(r'<a href="//b2.faloo.com/.* title="(.*?)"'), i)[
                               0])  # 加下标是为了去掉括号[],因为使用?取消贪婪匹配后每一个符合条件的都是列表形式,使用下标可以将每一个小列表中的字符串取出来
    # print(author_list)

    # 类型
    div_text3 = re.findall(re.compile(r'<span class="fontSize14andHui">(.*?)</a>'), response.text)
    model_list = []
    for i in div_text3:
        model_list.append(re.findall(re.compile(r'<a href="//b2.faloo.com/l.*" title="(.*?)" target="_blank">'), i)[
                              0])  # 加下标是为了去掉括号[],因为使用?取消贪婪匹配后每一个符合条件的都是列表形式,使用下标可以将每一个小列表中的字符串取出来
    # print(model_list)

    # 将爬取到的内容合并
    multi_list = map(list, zip(title_list, author_list, model_list))
    all_list = list(multi_list)
    # print(all_list)
    return all_list


def write_data():
    with open('./novel.txt', 'w', encoding='utf-8') as fw:
        fw.write('书名                            作者          类型\n')
        for i in parse_url():
            fw.write('     '.join(i) + '\n')


if __name__ == '__main__':
    print(parse_url())
    write_data()

新建spider_and_pymysql_2.py文件

import pymysql
# 导入自定义模块
from spider.Feilu_spider4 import parse_url

# 插入数据
def insert_info(all_list):
    mysql_db = pymysql.connect(host='192.168.198.142',
                               port=3306,
                               user='root',
                               password='Nebula@123',
                               database='Class_Linux')

    mysql_course = mysql_db.cursor()
    # db = connect_mysql()[0]
    # course = connect_mysql()[1]
    # 创建表
    create_table_sql = "create table if not exists novel_info(id int NOT NULL auto_increment primary key," \
                       "novel_name varchar(100)," \
                       "novel_author varchar(30)," \
                       "novel_type varchar(30))"  
    mysql_course.execute(create_table_sql)
    # 插入多条数据
    try:
        sql_insert = 'insert into novel_info values(NULL,"%s","%s","%s");'
        mysql_course.executemany(sql_insert, all_list)
        print("爬取到数据,开始插入")
        print(all_list)
        mysql_db.commit()
        print("数据插入成功!")
    except Exception as e:
        print(e, "数据插入失败!")
    print("操作成功!")


if __name__ == '__main__':
    insert_info(parse_url())

去MySQL查看发现插入成功!5634dda9abf34e6ab63150057477c8aa.png


【可能出现的报错!】

如果你的程序没有报错,去MySQL查看发现id被占了但是没有数据,例如下面的情况


查看表,发现没有数据:1c0852ba8ebe4f539e60cdc58f60c8ce.png

随便插入一条数据;a9b70982f9264731be276038dfb1a7cf.png 再查看,发现id被占了 

25fa809df6d94bb78fddb1aa11413c54.png


这可能是因为在我的代码里,我将创建连接对象和创建游标对象单独封装成立一个函数,在insert_info函数中,没有重新创建连接对象和创建游标对象,而是利用return调用了它的返回值,如果你也有这样的问题,就请给插入数据的函数重新创建连接对象和创建游标对象,下面是错误的代码:

import pymysql
# 导入自定义模块
from spider.Feilu_spider4 import parse_url


# 连接数据库
def connect_mysql():
    mysql_db = pymysql.connect(host='192.168.198.142',
                               port=3306,
                               user='root',
                               password='Nebula@123',
                               database='Class_Linux')

    mysql_course = mysql_db.cursor()
    return mysql_db, mysql_course


# 插入数据
def insert_info(all_list):
    db = connect_mysql()[0]
    course = connect_mysql()[1]
    # 创建表
    create_table_sql = "create table if not exists novel_info(id int NOT NULL auto_increment primary key," \
                       "novel_name varchar(100)," \
                       "novel_author varchar(30)," \
                       "novel_type varchar(30))"  # 为啥加个)就行了?????
    course.execute(create_table_sql)
    # 插入多条数据
    try:
        sql_insert = 'insert into novel_info values(NULL,"%s","%s","%s");'
        course.executemany(sql_insert, all_list)
        print("爬取到数据,开始插入")
        print(all_list)
        db.commit()
        print("数据插入成功!")
    except Exception as e:
        print(e, "数据插入失败!")
    print("操作成功!")


if __name__ == '__main__':
    # connect_mysql()
    insert_info(parse_url())

 

 

 

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python可以使用多种库来操作MySQL数据库,其中包括PyMySQLmysqlclient。PyMySQL是一个纯Python编写的库,安装非常简单,而mysqlclient是底层使用C编写的库,安装可能会有一些问题。\[3\]你可以根据自己的需求选择其中之一进行安装和使用。 在使用PyMySQL库时,你可以使用%s作为参数占位符来执行SQL操作,这与Python自带的sqlite3模块的占位符问号(?)有所不同。如果需要更详细的文档,你可以参考PyMySQL的官方文档。\[2\] 如果你想了解更多关于Python操作MySQL的知识,可以参考一些专门的章节或教程,这些资源会更详细地介绍如何使用Python来进行MySQL数据库操作。\[1\]希望这些信息对你有所帮助! #### 引用[.reference_title] - *1* [Python操作MySQL](https://blog.csdn.net/sanylove/article/details/124166373)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [太全了——用Python操作MySQL的使用教程集锦](https://blog.csdn.net/m0_59485658/article/details/126364328)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Python操作MySql](https://blog.csdn.net/PAN_BING/article/details/120812542)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LKsTaRt~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值