Python连接数据库

发布时间:2023年12月20日

一、安装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)
文章来源:https://blog.csdn.net/qq_43368987/article/details/135111829
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。