并不是原创了,把知乎Ehco老哥的lazyspider拿来改了,原网站https://zhuanlan.zhihu.com/p/32159453
修改了下报错、查询语句,具体看代码
import pymysql class LazyMysql(): def __init__(self, configs): #初始化账户密码之类 self.configs = configs self.connect() def connect(self): #相当于选定用户、数据库 connection = pymysql.connect( host=self.configs['host'], user=self.configs['user'], password=self.configs['password'], db=self.configs['db'], charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor ) return connection def query(self, sql): #输入sql语句,连接、操作sql、提交、关闭 '''query没问题时提交返回fetchall,出问题就返回-1''' try: connection=self.connect() with connection.cursor() as cursor: cursor.execute(sql) connection.commit() res = cursor.fetchall() #直接使用query时,可以返回table全部的值,是个list return res except Exception as e: raise ValueError('输入表名/列名不对!: %s' % e) finally: connection.close() def save_one_data(self, table,data): '''插入一条数据, data:dict,table:str 列名不对,query会报错;数据有问题,报错; 成功fetchall不会返回的''' fields = '' values = '' datas = {} try: for k, v in data.items(): datas.update({k: pymysql.escape_string(str(v))}) #把data放进datas里 for d in datas: fields += "`{}`,".format(str(d)) values += "'{}',".format(str(datas[d])) #两个 的引号不一样,不能用'''因为这样不能插入数据 except Exception as e: raise ValueError('输入数据有问题: %s' % e) else: sql = "insert ignore into {}({}) values({})".format( #ignore不注入相同的数据 table, fields[:-1], values[:-1]) res = self.query(sql) return '插入成功!!' def delete_by_field(self, table, field, field_value): '''删除一条数据,table:str;field:列名str;field_value:条件str 列名不对,query会报错;; delete前先查找,没有就报错''' sql1 = "select * from {} where {} = '{}'".format( table, field, field_value) res1 = self.query(sql1) sql = "delete from {} where {} = '{}'".format( table, field, field_value) res = self.query(sql) if res1==(): print('没这个条件!!') else: return '删除成功!!' def update_by_id(self, table, id_value,data): '''这个很难用,没返回值的,错了的话可能会全部更新,要先判断where条件是否成立再行动 ''' datas = {} updates = '' try: for k, v in data.items(): datas.update({k: pymysql.escape_string(str(v))}) for d in datas: updates += "{}='{}',".format(str(d), str(datas[d])) except Exception as e: raise ValueError('输入数据有问题: %s' % e) else: sql = "update {} set {} where id = '{}'".format( table, updates[:-1], str(id_value))#updates[:-1]因为循环添加{}时会多出一个逗号, res = self.query(sql) return res def find_all(self, table, limit=10): '''table:str 从数据库里查询多条数据,返回对应数据 ''' sql = "select * from {} limit 0,{}".format(table, limit)#limit 0 是指偏移量,那个开始 res = self.query(sql) return '查找条件错误!!' if res == () else res def find_by_field(self, table, field, field_value): '''table:str;field:列名str;field_value:条件str 从数据库里查询单个条件的数据 ''' sql = "select * from {} where {} = '{}'".format( table, field, field_value) res = self.query(sql) return '查找条件错误!!' if res == () else res def find_by_fields(self, table, queryset={}): '''table:str; queryset:多个条件 dict 从数据库里查询多个条件的数据 ''' querys = "" for k, v in queryset.items(): querys += "{} = '{}' and ".format(k, v) sql = "select * from {} where {} ".format( table, querys[:-4]) res = self.query(sql) return '查找条件错误!!' if res == () else res
使用方法如下:
import LazyMysql
# 数据库配置
TEST_DB = {
'host': '127.0.0.1',
'user': 'root',
'password': 'xxx',
'db': 'EhcoTestDb'
}
# 初始化数据库链接
store = LazyMysql(TEST_DB)
保存数据
# 将要保存的数据以字典格式存储
data = {'id': 1, 'name': 'ehco', 'age': 20}
# 新增数据的方法
# 只需要传入 数据<dict> 表名 两个参数
state = store.save_one_data(data, 'testtable')
print(state)
# 数据保存成功会返回1
# 保存失败会返回-1 并打印错误堆栈
>>1
删除数据
# 这里我将id为1的数据删除
state = store.delete_by_field('testtable','id','1')
print (state)
>>1
更新数据
# 这里我更新id为1的name字段
data = {'id': 1, 'name': 'superehco', 'age': 20}
state = store.update_by_id(data, 'testtable', '1')
print(state)
>>1
查询数据
# 这里我更新id为1的name字段
res = store.find_by_field('testtable', 'age', '20')
print(res)
# 返回的是一个列表,每条查询记录都以字典格式返回
'''
[{'id': 1, 'name': 'superehco', 'age': 20}, {'id': 2, 'name': 'lurenjia', 'age': 20}]
'''
SQL语句查询
# 手撸sql也是必备的
sql = "select * from testtable"
res = store.query(sql)
print(res)
'''
[{'id': 1, 'name': 'superehco', 'age': 20}, {'id': 2, 'name': 'lurenjia', 'age': 20}]