Python连接数据库

文章目录

  • 一、安装mysql
  • 二、SQLyog可视化操作
  • 三、python实现数据库单表类封装
    • 1. config 文件——`config.py`
    • 2. 封装类(model)——`model.py`
    • 3. 测试文件——`test.py`

一、安装mysql

官网安装,或者Windows64位直接在我的资源里面上传了mysql,不是8(最新),但是使用足够了。介意者转官网下载!
安装之后记得在服务里面开启mysql的服务,开启之后皆可以用了,如果想要方便一点记得去配置一下全局路径。不详写了,不知道的搜搜或者评论交流。

二、SQLyog可视化操作

不想写sql语句的(不建议,该写的还是要写的),或者是为了方便看数据,可以下载SQLyog,还有其他的软件也可以,直接在github上找绿色版就可以下到,安装右手就会。
在这里插入图片描述
在这里插入图片描述

三、python实现数据库单表类封装

文件结构
在这里插入图片描述

1. config 文件——config.py

记录数据库的信息

# 数据库配置信息
HOST = "localhost"
USER = "root"
PASSWD = ""
DBNAME = "mydb"
PORT = 3306

2. 封装类(model)——model.py

实现单表的增删改查

import pymysql			# pip install pymysql
from db import config

class Model:
    '''单表信息操作类'''
    tab_name = None  # 表名
    link = None  # 数据库连接对象
    cursor = None  # 游标对象
    pk = "id"  # 表的主键名
    fields = []  # 当前表的字段

    def __init__(self, table, config=config):
        '''构造函数,初始化表名,连接数据库'''
        try:
            self.tab_name = table
            self.link = pymysql.connect(host=config.HOST, user=config.USER, password=config.PASSWD, db=config.DBNAME,
                                        charset="utf8")
            self.cursor = self.link.cursor(pymysql.cursors.DictCursor)  # 不加该参数返回元组
            self.__getFields()  #不需要自定义表字段
        except Exception as error:
            print("数据库连接异常:", error)

    def __getFields(self):
        '''加载当前表的字段信息,私有方法'''
        sql = "SHOW COLUMNS FROM %s" % (self.tab_name)
        self.cursor.execute(sql)
        dlist = self.cursor.fetchall()
        for v in dlist:
            self.fields.append(v['Field'])
            if v['Key'] == 'PRI':
                self.pk = v['Field']

    def findAll(self):
        '''获取当前表的所有信息,返回信息列表,没有信息的返回空表'''
        try:
            sql = "select * from %s" % (self.tab_name)
            print(sql)
            self.cursor.execute(sql)
            info_list = self.cursor.fetchall()
            return info_list
        except Exception as error:
            print("查询数据有异常:", error)

    def findOne(self, data_id):
        '''获取指定data_id的单条数据'''
        try:
            sql = "select * from %s where id = %d" % (self.tab_name, data_id)
            print(sql)
            self.cursor.execute(sql)
            info = self.cursor.fetchone()
            return info
        except Exception as error:
            print("查询数据有异常:", error)

    def select(self, where=[], order=None, limit=None):
        '''带条件的信息查询'''
        try:
            sql = "select * from %s" % (self.tab_name)
            if isinstance(where, list) and len(where) > 0:
                sql += " where " + " and ".join(where)
            if order is not None:
                sql += " order by " + order
            if limit is not None:
                sql += " limit " + str(limit)
            print(sql)
            self.cursor.execute(sql)
            info = self.cursor.fetchall()
            return info
        except Exception as error:
            print(error)

    def save(self, data={}):
        '''添加数据方法,参数data为字典格式,key为表字段名,value为数值'''
        try:
            keys = []
            values = []
            if isinstance(data,dict):
                for k, v in data.items():
                    if k in self.fields:
                        keys.append(k)
                        values.append(v)
            else:
                print("数据非字典格式!")
                raise Exception
            # insert into 表名 (字段链表)values (值列表)
            sql = "insert into %s(%s) values(%s)"%(self.tab_name,','.join(keys), ','.join(['%s']*len(values)))
            print(sql)
            # 与其他直接执行的不太一样,先使用占位符,之后将列表转换为元组作为参数传入sql与其中的key值一一对应
            self.cursor.execute(sql,tuple(values))
            self.link.commit()
            # 返回插入数据的键值
            return self.cursor.lastrowid
        except Exception as error:
            print("添加数据出现错误!!!")

    def update(self, data={}):
        '''修改数据方法,参数是字典格式,key为表字段名,value为数值,参数data中要有主键的值,为修改条件'''
        try:
            values = []
            if isinstance(data,dict):
                for k, v in data.items():
                    if (k in self.fields) and (k != self.pk):
                        values.append("%s = '%s'" %(k,v))
            else:
                print("数据非字典格式!")
                raise Exception
            # ','.join(values)会将所有的数值都用,连接起来
            sql = "update %s set %s where %s=%s "%(self.tab_name,','.join(values),self.pk,data['id'])
            print(sql)
            self.cursor.execute(sql)
            self.link.commit()
            # 返回插入数据的键值
            return self.cursor.rowcount
        except Exception as error:
            print("修改数据出现错误!!!")

    def delete(self, id=0):
        '''删除数据,参数id为删除的数据主键值'''
        try:
            sql = "delete from %s where %s='%s'"%(self.tab_name,self.pk,str(id))
            print(sql)
            # 与其他直接执行的不太一样,先使用占位符,之后将列表转换为元组作为参数传入sql与其中的key值一一对应
            self.cursor.execute(sql)
            self.link.commit()
            # 返回插入数据的键值
            return self.cursor.rowcount
        except Exception as error:
            print("SQL执行错误!!!")

    def __del__(self):
        '''析构关闭游标和数据库'''
        if self.cursor != None:
            self.cursor.close()
        if self.link != None:
            self.link.close()

3. 测试文件——test.py

# 测试
from db.model import Model

if __name__ == "__main__":
    m= Model('stu')
    print(m.fields)
    # 查看stu表中所有数据
    # all_info = m.findAll()
    # for i in all_info:
    #     print(i)
    # 查看stu表中逐渐为8的数据
    # one_data = m.findOne(8)
    # print(one_data)
    # 查看stu表格中性别为w,年龄小于50,按照年龄递减排序后的前两个数据
    # select_info = m.select(where=["sex='w'","age<50"],order="age desc",limit='2')
    # for row in select_info:
    #     print(row)
    # 更新主键(id)为12的数据name为qq14,年龄为30,sex为m,classid为python03
    # a = m.update({"name":"qq14","age":30,"sex":"m","classid":"python03","id":12})
    # 删除主键为7的数据
    # print(m.delete(7))
    # print(m)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/261716.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python: 函数参数是值传递还是引用传递

是引用传递。 Python的设计哲学是一切皆对象&#xff0c;不仅体现在内置数据类型、数据结构是对象&#xff0c;还包括Python编译运行需要的一些设施&#xff0c;比如stackframe、traceback等等。所以&#xff0c;为了更方便的传递数据&#xff0c;cpython内部全部采用指针传递…

如何开发专属花店展示平台小程序?

如今&#xff0c;微信小程序已经成为了花店行业拓展客户资源的重要工具。通过开发一个专属花店小程序&#xff0c;你可以为自己的花店带来更多的曝光和客户资源。那么&#xff0c;如何开发一个专属花店小程序呢&#xff1f;接下来&#xff0c;我们将一步步为你详细讲解。 首先&…

Valentina Studio Pro for Mac:高效数据库管理工具

作为一款强大而高效的数据库管理工具&#xff0c;Valentina Studio Pro for Mac在Mac平台上的表现无疑是令人印象深刻的。无论您是初学者还是专业数据库管理员&#xff0c;Valentina Studio Pro都能够满足您的需要&#xff0c;并提供一流的工具和功能来简化数据库管理的过程。 …

电机(按用途分类)介绍

文章目录 一、前言二、按用途分类1.步进电机1.1 介绍1.2 工作原理1.3 单极性和双极性1.4 驱动方式1.4.1 全步1.4.2 半步1.4.3 微步 1.5 分类1.6 应用 2.伺服电机2.1 介绍2.2 工作原理2.3 分类2.3.1 直流伺服电机2.3.1.1 特性2.3.1.2 有刷和无刷 2.3.2 交流伺服电机2.3.2.1 特性…

PPT怎么做成二维码?扫二维码就能获得文档

在工作中很多的小伙伴可能经常会用到PPT这一种类型的文件&#xff0c;比如做年度总结、项目汇报、产品介绍等等类型的内容。那么需要将做的PPT课件分享给其他人时&#xff0c;将文件制作二维码图片后分享的方法会更加的简单方便&#xff0c;其他人只需要扫描二维码就可以查看或…

Redis基础篇-002 初识Redis

1、认识NoSQL 1.1 概念 NoSQL是一个非关系型数据库。 常见的NoSQL有&#xff1a;Redis、MongoDB 1.2 NoSQL与SQL的区别 类别SQLNoSQL数据结构结构化非结构化数据关联关联非关联查询方式SQL非SQL事务特性ACIDBASE存储方式磁盘内存扩展性垂直水平使用场景1&#xff09;数据结…

论文润色机构哪个好 PaperBERT

大家好&#xff0c;今天来聊聊论文润色机构哪个好&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff0c;可以借助此类工具&#xff1a; 标题&#xff1a;论文润色机构哪个好――专业、高效、可靠的学术支持 一…

什么是大小端?

今天说一下什么是大小端模式&#xff1f; 大小端模式指的是什么&#xff1f;通常我们在存储器当中存储数据的字节顺序&#xff0c;注意这里强调的是“字节的顺序”。因为在计算机系统中&#xff0c;不管是单片机DSP或者是X86&#xff0c;我们说一个地址对应的存储空间大小呢就是…

一款超级给力的弱网测试神器—Qnet(上)

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

yum install net-tools 命令报错,无法安装成功

编辑网卡文件 插入数据&#xff0c;输入&#xff1a; i 保存编辑&#xff1a;输入 Esc 然后:wq

APP测试要点有哪些?本文已经给你梳理好了!

我们日常购物、旅游、支付等活动都离不开手机&#xff0c;由此衍生了很多APP。 比如每天使用频率非常高的微信、支付宝、微博、抖音、王者荣耀等等。 APP测试主要进行功能测试、性能测试、自动化测试、安全性测试、兼容性测试、专项测试。 01 APP测试流程 APP测试流程与web…

flask 之上传与下载

from flask import Flask, render_template, request, send_from_directory, redirect, url_for import osapp Flask(__name__)# 上传文件存储路径 UPLOAD_FOLDER uploads app.config[UPLOAD_FOLDER] UPLOAD_FOLDERapp.route(/) def index():# 确保上传文件夹存在if not os.…

理解按需自动导入 unplugin-auto-import unplugin-vue-components

文章目录 unplugin-auto-import基础使用构建工具引入插件配置插件 import&#xff1a;配置自动导入规则使用预设自动引入第三方库自动导入 TypeScript 类型vue 预设的自动导入配置 dts&#xff1a;让编辑器环境识别 ts 类型eslintrc&#xff1a;解决 eslint 检查错误dirs&#…

毕业单纯的钻研嵌入式知识有前景吗?

今日话题&#xff0c;毕业单纯的钻研嵌入式知识有前景吗&#xff1f;嵌入式领域的薪资相对一般&#xff0c;但有着巨大的上升空间。然而&#xff0c;嵌入式开发的学习路径可能相对曲折。其中&#xff0c;理解计算机结构是其中之一的挑战&#xff0c;因为嵌入式系统对稳定性要求…

MyBatis见解2

5.MyBatis的原始Dao开发-了解 使用Mybatis开发Dao&#xff0c;通常有两个方法&#xff0c;即原始Dao开发方式和Mapper接口代理开发方式。而现在主流的开发方式是接口代理开发方式&#xff0c;这种方式总体上更加简便。我们的课程讲解也主要以接口代理开发方式为主。在第4节已经…

一个很好用的Docker可视化管理工具

目录 前言Portainer安装部署使用 前言 一个好的docker可视化管理工具&#xff0c;可以提升我们不少的工作效率&#xff0c;下面我就推荐一个我使用过的&#xff0c;感觉很不错的一个可视化管理工具给大家 Portainer Portainer是一个开源的Docker管理工具&#xff0c;提供了容…

前端手动部署与自动化部署

连接服务器 先购买服务器 安装vscode插件 连接服务器 连接成功 手动部署 安装nginx 启动nginx systemctl start nginx systemctl status nginx systemctl enable nginx启动 检查状态 开机就启动nginx 开始手动部署 配置nginx 成功

数据库学习日常案例20231221-oracle libray cache lock分析

1 问题概述&#xff1a; 阻塞的源头为两个ddl操作导致大量的libray cache lock 其中1133为gis sde的create table as语句。 其中697为alter index语句。

【贪心】最优装载问题Python实现

文章目录 问题描述形式化描述 贪心算法贪心选择性质最优子结构性质 时间复杂性Python实现 个人主页&#xff1a;丷从心 系列专栏&#xff1a;贪心算法 问题描述 有一批集装箱要装上一艘载重量为 c c c的轮船&#xff0c;其中集装箱 i i i的重量为 w i w_{i} wi​在装载体积不受…

QT打包exe文件,在其它电脑里双击exe就可以直接运行

想要不依赖QT环境&#xff0c;在其它电脑里直接双击exe文件就可以运行当前程序。具体打包过程如下&#xff1a; 使用QT编译出release版本的exe release版本运行无误后&#xff0c;需要找到当前构建生成的exe所在文件夹 可以看到具体目录在这里 我在该目录下的bin文件夹里找到…