一、安装依赖
pip install pymysql numpy
二、配置文件
utils.config.py
import os
############### 233 MySQL Configuration ###############
MYSQL_HOST = os.getenv("MYSQL_HOST", "192.168.0.233")
MYSQL_PORT = int(os.getenv("MYSQL_PORT", "3306"))
MYSQL_USER = os.getenv("MYSQL_USER", "psss")
MYSQL_PWD = os.getenv("MYSQL_PWD", "123456")
MYSQL_DB = os.getenv("MYSQL_DB", "my_db")
三、实现类
utils.mysqlOP.py
# encoding: utf-8
# sql导出
# mysqldump -u root -p db_name > test_db.sql
import pymysql
import config.config as cf
import json
import numpy as np
class MySqlOp(object):
def __init__(self, host=cf.MYSQL_HOST, port=cf.MYSQL_PORT, username=cf.MYSQL_USER, password=cf.MYSQL_PWD, db=cf.MYSQL_DB):
self.host = host
self.port = port
self.username = username
self.password = password
self.db = db
# 增删改
def operate(self, sql):
db = pymysql.connect(host=self.host, port=self.port, user=self.username, passwd=self.password, db=self.db)
cur = db.cursor()
try:
# 执行sql语句
cur.execute(sql)
op_id = cur.lastrowid
cur.close()
# 提交到数据库执行
db.commit()
except Exception as e:
print(e)
op_id = None
cur.close()
# Rollback in case there is any error
db.rollback()
# 关闭数据库连接
db.close()
return op_id
# 查
def select(self, sql):
db = pymysql.connect(host=self.host, port=self.port, user=self.username, passwd=self.password, db=self.db)
cur = db.cursor()
results = None
try:
# 执行sql语句
cur.execute(sql)
# 获取所有记录列表
results = cur.fetchall()
# print(results)
except Exception as e:
print(e)
# 关闭数据库连接
db.close()
return results
@classmethod
def escape_str(cls, text):
'''
string类型数据导入时有可能出现单双引号等需要转义的字段,也可能出现nan这样的字段,需要先处理一下
:return:
'''
if cls.isNaNo(text):
return 'null'
else:
return json.dumps(str(text), ensure_ascii=False)
@classmethod
def escape_num(cls, text):
'''
转一下整数,报错的话说明传入的不是数字,有sql注入风险
:return:
'''
if str(text) == '0':
return '0'
elif cls.isNaNo(text):
return 'null'
else:
# return json.dumps(str(text), ensure_ascii=False)
try:
int(text)
return str(text)
except Exception as e:
raise Exception('传入不是数字,有sql注入风险')
# if cls.isNaNo(text):
# return 'null'
# else:
# return json.dumps(str(text), ensure_ascii=False)
@classmethod
def isNaNo(cls, sth):
'''
NaN、None或者空字符串返回True,其他情况返回False
'''
if not sth:
return True
if isinstance(sth, float):
if np.isnan(sth):
return True
return False
if __name__ == '__main__':
# 创建数据库连接
msq = MySqlOp()
# 执行sql
book = msq.select('''show full columns from my_table;''')
print(book) # (('id', 'int', None, 'NO', 'PRI', None, 'auto_increment', 'select,insert,update,references', ''), ('ruid', 'varchar(255)', 'utf8_unicode_ci', 'YES', '', None, '', 'select,insert,update,references', ''), ('title', 'varchar(255)', 'utf8_unicode_ci', 'YES', '', None, '', 'select,insert,update,references', ''), ('author', 'varchar(255)', 'utf8_unicode_ci', 'YES', '', None, '', 'select,insert,update,references', ''))
# res = msq.select(f'''select id, src_ruid from book''')
# for book in res:
# id_ = book[0]
# src_ruid = book[1]
#
# print(id_)
#
# src_ruid = src_ruid.replace('http:www.bookschina.com', '')
#
# msq.operate(f'''update book set src_ruid={src_ruid} where id={id_}''')