#!/usr/bin/env python # -*- encoding: utf-8 -*- ''' @Date:2022/08/26 08:34:30 ''' # import sys # sys.path.append('.') # import pymysql # import pymysql # conn = pymysql.connect(host='127.0.0.1', port=3306, # user='root', passwd='123456', db='local_rms_db') # cur = conn.cursor(cursor=pymysql.cursors.DictCursor) # sql = "select * from rms_user" # cur.execute(sql) # data = cur.fetchall() # print(data) # import os # from flask import Flask, jsonify # app = Flask(__name__) # def get_file_base(): # import base64 # with open(os.getcwd() + "/config/tem_00001.xlsx", "rb") as f: # file_str = f.read() # file_str = base64.b64encode(file_str).decode() # return file_str # @app.route("/get_file", methods=["GET"]) # def main_file(): # return jsonify(get_file_base()) # if __name__ == '__main__': # app.run("127.0.0.1", 8001) db_name = "user" data_list = [ {"variety_id": "f8442a6e-9950-11ec-a502-e2052a1045e4", "remark1": "", "remark2": "", "remark3": "\u6613\u5236\u6bd2", "remark4": "", "name": "\u7532\u82ef", "english_name": "", "purity": "AR\uff08\u6caa\u8bd5\uff09\uff0c\u2265 99.5%", "cas_number": "108-88-3", "remark5": "", "speci": "500", "speci_unit": "ml", "export_count": "1", "remark6": "\u74f6", "production_date": "2022-03-01", "shelf_life": 10529, "price": "0", "is_supervise": 0, "remain": "683", "manufacturer": "\u56fd\u836f", "remark8": "", "remark9": "\u70f7\u57fa\u6c5e", "remark10": ""}, {"variety_id": "f8442a6f-9950-11ec-9253-e2052a1045e4", "remark1": "", "remark2": "", "remark3": "\u5371\u5316\u54c1", "remark4": "", "name": "\u82ef\u915a", "english_name": "", "purity": "AR\uff08\u6caa\u8bd5\uff09\uff0c\u2265 99.0%", "cas_number": "108-95-2", "remark5": "", "speci": "500", "speci_unit": "ml", "export_count": "1", "remark6": "\u74f6", "production_date": "2022-03-01", "shelf_life": 10529, "price": "0", "is_supervise": 0, "remain": "848", "manufacturer": "\u56fd\u836f", "remark8": "", "remark9": "\u6325\u53d1\u915a", "remark10": ""}, {"variety_id": "f8442a70-9950-11ec-a157-e2052a1045e4", "remark1": "", "remark2": "", "remark3": "\u5371\u5316\u54c1", "remark4": "", "name": "\u82ef", "english_name": "", "purity": "AR\uff08\u6caa\u8bd5\uff09\uff0c\u2265 99.5%", "cas_number": "71-43-2", "remark5": "", "speci": "500", "speci_unit": "ml", "export_count": "1", "remark6": "\u74f6", "production_date": "2022-03-01", "shelf_life": 10529, "price": "0", "is_supervise": 0, "remain": "640", "manufacturer": "\u56fd\u836f", "remark8": "", "remark9": "\u6cb9", "remark10": ""}, {"variety_id": "f8442a71-9950-11ec-9894-e2052a1045e4", "remark1": "", "remark2": "", "remark3": "\u5371\u5316\u54c1", "remark4": "", "name": "\u4e59\u9178\uff0836%\uff09", "english_name": "", "purity": "AR", "cas_number": "64-19-7", "remark5": "", "speci": "500", "speci_unit": "ml", "export_count": "1", "remark6": "\u74f6", "production_date": "2022-03-01", "shelf_life": 10529, "price": "0", "is_supervise": 0, "remain": "734", "manufacturer": "\u56fd\u836f", "remark8": "", "remark9": "\u70f7\u57fa\u6c5e", "remark10": ""}, {"variety_id": "f84451a6-9950-11ec-8925-e2052a1045e4", "remark1": "", "remark2": "", "remark3": "\u5371\u5316\u54c1", "remark4": "", "name": "\u4e59\u9178\u9150", "english_name": "", "purity": "AR", "cas_number": "106-24-7", "remark5": "", "speci": "500", "speci_unit": "ml", "export_count": "1", "remark6": "\u74f6", "production_date": "2022-03-01", "shelf_life": 10529, "price": "0", "is_supervise": 0, "remain": "749", "manufacturer": "\u56fd\u836f", "remark8": "", "remark9": "\u70f7\u57fa\u6c5e", "remark10": ""}, {"variety_id": "f84451a7-9950-11ec-9b4e-e2052a1045e4", "remark1": "", "remark2": "", "remark3": "\u5371\u5316\u54c1", "remark4": "", "name": "\u56db\u6c2f\u4e59\u70ef", "english_name": "", "purity": "\u73af\u4fdd\u7ea7", "cas_number": "127-18-4", "remark5": "", "speci": "500", "speci_unit": "ml", "export_count": "28", "remark6": "\u74f6", "production_date": "2022-03-01", "shelf_life": 10529, "price": "0", "is_supervise": 0, "remain": "1207", "manufacturer": "\u5929\u6d25\u50b2\u7136", "remark8": "", "remark9": "\u6cb9", "remark10": ""}, {"variety_id": "f84451a8-9950-11ec-96ca-e2052a1045e4", "remark1": "", "remark2": "", "remark3": "\u5371\u5316\u54c1", "remark4": "", "name": "\u56db\u6c2f\u5316\u78b3", "english_name": "", "purity": "\u7ea2\u5916\u6d4b\u6cb9\u4eea\u4e13\u7528", "cas_number": "56-23-5", "remark5": "", "speci": "500", "speci_unit": "ml", "export_count": "31", "remark6": "\u74f6", "production_date": "2022-03-01", "shelf_life": 10529, "price": "0", "is_supervise": 0, "remain": "1126", "manufacturer": "\u5b89\u8c31", "remark8": "", "remark9": "\u77ff\u7269\u6cb9", "remark10": ""}] # sql_header = f"insert into {}" key_tup = [] value_tup = [] if data_list: base_da = data_list[0] for k,v in base_da.items(): key_tup.append(k) value_tup.append("%s") insert_sql = f"insert into {db_name}({','.join(key_tup)}) values({','.join(value_tup)})" print(insert_sql) "".join import pymysql from dbutils.pooled_db import PooledDB # from common.db.mysql_config import MysqlConfig """ pymysql封装总结 https://blog.csdn.net/zhj_1121/article/details/121070412 python操作mysql之只看这篇就够了 https://www.jianshu.com/p/4e72faebd27f 关于PooledDB使用autocommit的方法 https://blog.51cto.com/abyss/1736844 """ class MysqlPool: """ MySQL 数据库连接池类 配置变量 """ ''' :param reset: how connections should be reset when returned to the pool (False or None to rollback transcations started with begin(), True to always issue a rollback for safety's sake) :param setsession: optional list of SQL commands that may serve to prepare the session, e.g. ["set datestyle to ...", "set time zone ..."] ''' ''' https://blog.51cto.com/abyss/1736844 其中的 setsession=['SET AUTOCOMMIT = 1'] 就是用来设置线程池是否打开自动更新的配置,0为False,1为True ''' # 初始化数据库连接池变量 __pool = None # 创建连接池的最大数量 __MAX_CONNECTIONS = 20 # 连接池中空闲连接的初始数量 __MIN_CACHED = 5 # 连接池中空闲连接的最大数量 __MAX_CACHED = 5 # 共享连接的最大数量 __MAX_SHARED = 0 # 超过最大连接数量时候的表现,为True等待连接数量下降,为false直接报错处理 __BLOCK = True # 单个连接的最大重复使用次数 __MAX_USAGE = 1 # 当返回到池时,连接应该如何重置 # (False或None回滚以begin()开始的事务,为了安全起见,总是发出回滚) __RESET = True # 设置自动提交 __SET_SESSION = [] # 不能是 UTF-8 __CHARSET = 'UTF8' def __init__(self, host, port, user, password, database): """ :param host: 数据库主机地址 :param port: 端口号 :param user: 用户名 :param password: 密码 :param database: 数据库名 """ if not self.__pool: # self代表当前类的实例,即为 MysqlPool() 带小括号,执行后的数据。 # __class__,魔法函数,代表从当前类的实例中,获取当前类,即为 MysqlPool 不带小括号的类。 # __pool,这个代表的事类的变量,即为在类下面创建的初始化连接池,__pool self.__class__.__pool = PooledDB( creator=pymysql, host=host, port=port, user=user, password=password, database=database, maxconnections=self.__MAX_CONNECTIONS, mincached=self.__MIN_CACHED, maxcached=self.__MAX_CACHED, maxshared=self.__MAX_SHARED, blocking=self.__BLOCK, maxusage=self.__MAX_USAGE, setsession=self.__SET_SESSION, charset=self.__CHARSET ) def get_connect(self): return self.__pool.connection() class MysqlCursor: """ 从数据库配置环境,取出数据库配置参数 这里的参数,可以不从外部导入,直接手动写入也可以。 """ def __init__(self, host=host, port=port, user=user, password=password, database=database) -> None: """ :param host: 数据库主机地址 :param port: 端口号 :param user: 用户名 :param password: 密码 :param database: 数据库名 """ self.__host = host self.__port = port self.__user = user self.__password = password self.__database = database # 初始化数据库连接池 self.connects_pool = MysqlPool( host=self.__host, port=self.__port, user=self.__user, password=self.__password, database=self.__database ) def __enter__(self): """ # with 上下文管理,魔法函数,进入with时调用 :return: 当前类 """ # 从数据库链接池,获取一个数据库链接 connect = self.connects_pool.get_connect() # 从获取的数据库链接,获取一个光标 cursor = connect.cursor(pymysql.cursors.DictCursor) ''' # https://blog.51cto.com/abyss/1736844 # 如果使用连接池 则不能在取出后设置 而应该在创建线程池时设置 # connect.autocommit = False ''' # 将数据库链接,赋值给当前类,方便__exit__函数调用 self._connect = connect # 将数据库光标,赋值给当前类,方便__exit__函数调用 self._cursor = cursor # __enter__函数,必须返回当前类 return self def __exit__(self, *exc_info): """ # with 上下文管理,魔法函数,退出with时调用 :param exc_info: 异常信息,元祖 :return: None """ # 退出with上下文时,使用当前类链接,提交数据库语句 self._connect.commit() # 关闭光标 self._cursor.close() # 关闭链接 self._connect.close() @property def cursor(self): """ 数据库连接池,取出链接,取出光标,转换为光标属性 :return: 数据库连接池的光标 """ return self._cursor if __name__ == "__main__": with MysqlCursor() as db: # 获取数据库的方法 sql = 'select count(id) as total from people' db.cursor.execute("select count(id) as total from people") data = db.cursor.fetchone() print('--------统计数据条数', data)