python快速插入mysql数据库————lazyspider

并不是原创了,把知乎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语句查询

扫描二维码关注公众号,回复: 583540 查看本文章
# 手撸sql也是必备的
sql = "select * from testtable"
res = store.query(sql)
print(res)
'''
[{'id': 1, 'name': 'superehco', 'age': 20}, {'id': 2, 'name': 'lurenjia', 'age': 20}]





猜你喜欢

转载自blog.csdn.net/qq_38282706/article/details/80029035