首页 > 数据库 >python-26-Python ORM系列之pymysql实现对数据库的增删改查及新建表

python-26-Python ORM系列之pymysql实现对数据库的增删改查及新建表

时间:2024-11-10 19:45:05浏览次数:3  
标签:26 python 改查 self db results pymysql sql print

python-26-Python ORM系列之pymysql实现对数据库的增删改查及新建表

一.简介

在Python基础系列ORM部分我们为大家介绍了如何搭建MySQL数据和MySQL一些访问配置,同时细节的同学应该已经了解到了ORM的2个库pymysql和sqlalchemy;

PyMySQL — MySQL 数据库驱动,用于与 MySQL 数据库建立连接并执行 SQL 操作

SQLAlchemy — ORM 框架,提供了通过 Python 类与数据库表进行交互的能力。它依赖于数据库驱动(如 PyMySQL)来执行底层的 SQL 操作。

其实PyMySQL 在常规开发中已经具备了与MySQL数据库交互的能力,SQLAlchemy 是通过PyMySQL来实现与数据库的交互,所以我们不要着急,好菜要慢慢上,我们先介绍PyMySQL ,好,来开始我们今天的日拱一卒!

二.安装pymysql

#使用豆瓣源安装 提升安装速度
pip install pymysql -i http://pypi.doubanio.com/simple --trusted-host pypi.doubanio.com

三.创建一个数据库

我们先用Navicat创建一个数据库,用来作为测试!

注意:

字符集:utf8mb4

排序规则:utf8mb4_0900_ai_ci

在这里插入图片描述

四.创建python配置文件及配置文件调用包

创建配置文件db_config.ini

在当前项目中创建config文件夹,在文件夹下db_config.ini文件,作为我们的数据库配置文件,内容如下:

[localdb]
host     = localhost
user     = root
password = yourpsw
port     = 3306
database = myurlhub

创建配置文件调用帮助包

在当前项目中创建utils文件夹,新建__init__.py文件,里面不用写任何东西,在utils文件夹下新建config_helper.py文件,用来帮助我们获取配置文件信息,文件内容如下:

import configparser

class Config(object):
    def __init__(self, filename, encoding='UTF-8'):
        # 声明配置类对象
        self.config = configparser.ConfigParser()
        # 读取配置文件
        self.config.read(filename, encoding)

    def get_value(self, section, option):
        """获取 value"""
        value = self.config.get(section, option)
        return value
    def get_items(self, section):
        value = dict(self.config.items(section))
        return value
    
# 读取配置文件
# config.read(fileName, 'GBK')
# print(f"sections: {config.sections()}")
# print(f"options: {config.options('localdb')}")
# print(f"items: {config.items('localdb')}")

我们的整体结构文件:

在这里插入图片描述

五.创建我们的pymysql_helper.py 帮助程序包简化我们的调用操作

其实这时候已经可以使用pymysql来操作数据库了,但是别急因为好的程序员会创建一个帮助类库来帮助我们简化代码,和健全代码

在我们的utils文件夹下,新建pymysql_helper.py文件

#pymysql_helper.py文件
import pymysql
from utils import config_helper
import os

class PyManage:
    def __init__(self):
        # 加载数据库配置
        config_file_path = os.path.join(os.getcwd(),'config\db_config.ini') 
        config = config_helper.Config(config_file_path,'UTF-8')
        self.__localdb = config.get_items('localdb')
        # 建立数据库连接
        self.db = pymysql.connect(
            host=self.__localdb['host'],
            user=self.__localdb['user'],
            password=self.__localdb['password'],
            port=int(self.__localdb['port']),  # 确保端口是整数类型
            database=self.__localdb['database']
        )
    def execute(self, sql, params=None, commit=False):
        """
        执行 SQL 查询或更新语句。根据 SQL 类型执行查询或更新。
        
        参数:
            sql (str): SQL 查询或更新语句。
            params (tuple 或 dict): 可选的查询或更新参数。
            commit (bool): 如果是修改数据的操作(INSERT/UPDATE/DELETE),则传入 True 来提交事务。

        返回:
            results: 查询结果(对于 SELECT),如果是修改操作返回影响的行数。
        """
        results = None
        try:
            with self.db.cursor() as cursor:
                # 执行 SQL 语句,使用参数化查询防止 SQL 注入
                if params:
                    cursor.execute(sql, params)
                else:
                    cursor.execute(sql)

                # 如果是查询操作(SELECT),返回结果
                if sql.strip().lower().startswith('select'):
                    results = cursor.fetchall()

                # 如果是修改操作(INSERT/UPDATE/DELETE),提交事务
                if commit:
                    self.db.commit()
                    results = True

        except pymysql.MySQLError as e:
            print(f"数据库操作出错: {e}")
            if commit:
                # 如果是修改操作出错,回滚事务
                self.db.rollback()
                results = False
            else:
                results = None
        except Exception as e:
            print(f"发生未知错误: {e}")
            if commit:
                # 如果是修改操作出错,回滚事务
                self.db.rollback()
                results = False
            else:
                results = None
        return results

    def close(self):
        """显式关闭数据库连接。"""
        try:
            if self.db.open:
                self.db.close()
                print("数据库连接已关闭!")
        except Exception as e:
            print(f"关闭数据库连接时出错: {e}")

    def __del__(self):
        """析构函数,确保在对象销毁时关闭连接。"""
        self.close()


整体项目的结构:

在这里插入图片描述

代码包 放到我的资源里面了,大家找找如果审核通过,应该可以下!

七.使用pymysql库来帮我们创建一张表

  1. 在主程序main.py实现以下代码

    from utils import pymysql_helper
    
    db_manager = pymysql_helper.PyManage()
    
    create_table_sql = '''CREATE TABLE IF NOT EXISTS users (
                id INT AUTO_INCREMENT PRIMARY KEY,
                name VARCHAR(255) NOT NULL,
                age INT NOT NULL,
                email VARCHAR(255) UNIQUE NOT NULL
                );'''
    result = db_manager.execute(create_table_sql,commit=True)
    if result:
        print('执行成功!')
    else:
        print('执行失败!')
    db_manager.close()
    
    
    '''
    输出结果:
    执行成功!
    数据库连接已关闭!
    '''
    

    来看看执行后我们的数据库:

    在这里插入图片描述

八.使用pymysql库来给表里面新增数据

  1. 在主程序main.py实现以下代码

    sql_insert = "INSERT INTO users (name, age,email) VALUES (%s, %s,%s)"
    params_insert = ('SEEONTIME', 30,'[email protected]')
    result = db_manager.execute(sql_insert, params_insert, commit=True)
    if result:
        print('执行成功!')
    else:
        print('执行失败!')
    db_manager.close()
    
    
    '''
    执行成功!
    数据库连接已关闭!
    '''
    

    来看看执行后我们的数据库:

    在这里插入图片描述

九.使用pymysql库来查询数据

  1. 在主程序main.py实现以下代码

    # 查询数据
    sql_select = "select * from users"
    
    results = db_manager.execute(sql_select,commit=False)
    if results:
        print('执行成功!')
        print(results)
    else:
        print('执行失败!')
    db_manager.close()
    
    '''
    输出结果:
    执行成功!
    ((1, 'SEEONTIME', 30, '[email protected]'),)
    数据库连接已关闭!
    '''
    

十.使用pymysql库来修改数据

  1. 在主程序main.py实现以下代码

    # 修改数据
    sql_update = "UPDATE users SET age = %s WHERE name = %s"
    
    params = ( 35,'SEEONTIME')
    results = db_manager.execute(sql_update,params,commit=True)
    if results:
        print('执行成功!数据已修改。')
        sql_select = "select * from users"
        new_results = db_manager.execute(sql_select,commit=False)
        print(new_results)
    else:
        print('执行失败!')
    db_manager.close()
    '''
    输出结果:
    执行成功!数据已修改。
    ((1, 'SEEONTIME', 35, '[email protected]'),)
    数据库连接已关闭!
    '''
    

十一.使用pymysql库来删除数据

  1. 在主程序main.py实现以下代码

    # 删除数据
    sql_delete = "DELETE FROM users WHERE name = %s"
    params = ('SEEONTIME',)
    results = db_manager.execute(sql_delete,params,commit=True)
    if results:
        print('执行成功!数据已删除。')
        sql_select = "select * from users"
        new_results = db_manager.execute(sql_select,commit=False)
        print(new_results)
    else:
        print('执行失败!')
    db_manager.close()
    '''
    输出结果:
    执行成功!数据已删除。
    ()
    数据库连接已关闭!
    '''
    

十二.总结

写到这里我们还没有实现ORM,但是已经能够利用pymysql库来帮助我们操作数据库!可能大家看到这里发现这不还是sql语言么?sql换成存储过程不又是老一套,而是使用还是不方便,查询的数据还需要我们自己来处理!

对,这个方式确实不咋地,因为好菜还在后面。。。。

代码包 放到我的资源里面了,大家找找如果审核通过,应该可以下!

标签:26,python,改查,self,db,results,pymysql,sql,print
From: https://blog.csdn.net/Lookontime/article/details/143664676

相关文章

  • 三十六、Python基础语法(JSON操作)
    JSON(JavaScriptObjectNotation)是一种基于文本,轻量级的数据交换格式。它易于人阅读和编写,同时也易于机器解析和生成,在自动化测试中经常用来存放测试数据。JSON的特点:基于文本,不包含图片、音视频轻量级,定义相同数据量,JSON占用文件比较小独立于语言,所有编程语言都可以使......
  • Python从0到100(六十九):Python OpenCV-图像加噪与滤波
    前言:零基础学Python:Python从0到100最新最全教程。想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、计算机视觉、机器学习、神经网络以及人工智能相关知......
  • (开题)flask框架高校科研绩效管理系统设计与实现(程序+论文+python)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着高等教育的快速发展,高校科研活动日益频繁,科研成果丰硕。然而,如何科学、公正地评价教师的科研绩效,成为高校科研管理中的一个重要问题。......
  • (开题)flask框架高校科研信息管理系统(程序+论文+python)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着高等教育的蓬勃发展,高校科研活动日益活跃,科研项目数量激增,科研成果丰硕。然而,传统的科研管理方式已难以适应当前高效、快捷的信息处理......
  • C. 小红打怪 (python解)-牛客
    C.小红打怪(python解)-牛客原题链接:C.小红打怪问题分析:小红的全体打击技能对所有怪物造成1点伤害。队友1的单体打击技能可以对任意单个怪物造成1点伤害。队友2的范围攻击技能可以对相邻的两只怪物分别造成1点伤害(可对已死亡的怪物使用)。思路:设定一个函数check(mx)......
  • Python图片链接爬虫爬取图片代码
    importrequestsurl=‘https://desk-fd.zol-img.com.cn/t_s960x600c5/g5/M00/05/0F/ChMkJ1erCYqIQptxAAPESMfBQZoAAUU6QB4oVwAA8Rg091.jpg’headers={‘user-agent’:‘Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/1......
  • B. Replacement (python解)-codeforces
    B.Replacement(python解)-codeforces原题链接:B.Replacement问题分析:我们有两个二进制字符串:s(长度为n)和r(长度为n-1)。根据游戏规则,我们需要在s上执行n-1次操作。在每次操作中,我们选择一个索引k,使得s[k]和s[k+1]不相同并将这两个字符替换为r[i](第i次操作中r的......
  • 【最新原创毕设】基于移动端的助农电商系统+08655(免费领源码)可做计算机毕业设计JAVA、
    基于移动端的助农电商系统的设计与实现摘要近年来,电子商务的快速发展引起了行业和学术界的高度关注。基于移动端的助农电商系统旨在为用户提供一个简单、高效、便捷的农产品购物体验,它不仅要求用户清晰地查看所需信息,而且还要求界面设计精美,使得功能与页面完美融合,从而提升......
  • (2024最新毕设合集)基于SpringBoot的梓锦社区疫苗接种服务系统+42529|可做计算机毕业设
    目 录摘要1绪论1.1选题背景与意义1.2开发现状1.3论文结构与章节安排2 梓锦社区疫苗接种服务系统系统分析2.1可行性分析2.1.1技术可行性分析2.1.2 经济可行性分析2.1.3法律可行性分析2.2系统功能分析2.2.1功能性分析2.2.2非功能性分析2.......
  • Python 入门-2
    1.函数输出函数:print 1.*values:表示可以一次性输出多个对象,输出多个对象时,需要用,隔开(英文逗号) 输出多个内容逗号隔开,英文符号 print('哈哈哈','嘻嘻嘻','嘿嘿嘿')2.sep:用来间隔多个对象,默认值是一个空格,可随意更换 print('哈哈哈','嘻嘻嘻','嘿嘿嘿',sep=',') sep......