You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

256 lines
11 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#!/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为False1为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)