mysql数据操作工具函数

def dict_fetchall(cursor):
# 将查询多行数据 转为 json列表
# return all rows from a cursor as a dict list
columns = [col[0] for col in cursor.description]
return [dict(zip(columns, row)) for row in cursor.fetchall()]

mysql实践代码

import pymysql

# config
DB_CONFIG = {
    # "host": "127.0.0.1",
    "host": "121.43.147.156",

    "port": 3308,
    "user": "root",

    "passwd": "cxj@123456",
    # "passwd": "",

    "db": "facexiaoyan",
    "charset": "utf8"

}


class MySQLManager(object):

    def __init__(self):
        self.conn = None
        self.cursor = None
        self.connect()

    def connect(self):
        self.conn = pymysql.connect(
            host=DB_CONFIG["host"],
            port=DB_CONFIG["port"],
            user=DB_CONFIG["user"],
            passwd=DB_CONFIG["passwd"],
            db=DB_CONFIG["db"],
            charset=DB_CONFIG["charset"]
        )
        self.cursor = self.conn.cursor()

    def close(self):
        self.cursor.close()
        self.conn.close()
        print('mysql:finished')

    def __def__(self):
        self.cursor.close()
        self.conn.close()

    # 查询数据
    def fetchone(self, query, n=9999999):
        print(query)
        self.cursor.execute(query)
        for _ in range(n):
            one = self.cursor.fetchone()  # tuple
            if one:
                return one

    def fetchone_dt(self, query, n=9999999):
        print(query)
        rowcount = self.cursor.execute(query)
        columns = [i[0] for i in self.cursor.description]
        length = len(columns)
        for _ in range(min(n, rowcount)):
            one = self.cursor.fetchone()  # tuple
            return {columns[i]: one[i] for i in range(length)}

    def get_one(self, sql, args=None):
        self.cursor.execute(sql, args)
        row = self.cursor.fetchone()
        result = row[0]
        return result

    def get_row(self, sql, args=None):
        self.cursor.execute(sql, args)
        result = self.cursor.fetchone()
        return result

    def get_rows(self, sql, args=None):
        # 查询多行数据,结果:row tuple of tuple
        self.cursor.execute(sql, args)
        result = self.cursor.fetchall()
        return result

    # 返回数据多样化:json、列表
    def dict_fetchall(self, sql, args=None):
        # 将查询多行数据,转为每行数据生成一个dict,row_dict元素的列表
        # dict:{field1:row1value1,field2:row1value2,field3:row1value3}
        self.cursor.execute(sql, args)
        columns = [col[0] for col in self.cursor.description]
        result = [dict(zip(columns, row)) for row in self.cursor.fetchall()]
        return result

    def columns_list_fetchall(self, query, n=9999999):
        # 将查询多行数据,全部多行数据转为:大列表套小列表,每列数据为一个小列表
        print(query)
        self.cursor.execute(query)
        columns = [i[0] for i in self.cursor.description]
        length = len(columns)
        elems = self.cursor.fetchall()
        columns_list = list()
        for i in range(length):
            columns_list.append([])
        for elem in elems:
            for i in range(length):
                columns_list[i].append(elem[i])
        result = columns_list[0] if length == 1 else columns_list
        return result

    def one_list_fetchall(self, sql, args=None):
        # 将查询多行数据,全部多行数据转为:同一个列表
        from itertools import chain
        self.cursor.execute(sql, args)
        elems = self.cursor.fetchall()
        resultlist = list(chain.from_iterable(elems))
        return resultlist

    # 写入数据
    def create(self, sql, args=None):
        self.cursor.execute(sql, args)
        self.conn.commit()
        last_id = self.cursor.lastrowid
        return last_id

    def modify(self, sql, args=None):
        self.cursor.execute(sql, args)
        self.conn.commit()

    # 执行多条SQL语句
    def multi_modify(self, sql, args=None):
        self.cursor.executemany(sql, args)
        self.conn.commit()

    def commit(self, sql):
        print(sql)
        try:
            self.cursor.execute(sql)
            self.conn.commit()
        except Exception as e:
            print(e)

    def insert(self, dt, tb):
        ls = [(k, v) for k, v in dt.items() if v is not None]
        sql = 'INSERT %s (' % tb + ','.join(i[0] for i in ls) + \
              ') VALUES (' + ','.join('%r' % i[1] for i in ls) + ')'
        self.commit(sql)

    def update(self, dt, dt_condition, tb):
        sql = 'UPDATE %s SET ' % tb + ','.join('%s=%r' % (k, v) for k, v in dt.items()) \
              + ' WHERE ' + ' AND '.join('%s=%r' % (k, v) for k, v in dt_condition.items())
        self.commit(sql)

    def insert_or_update(self, dt, dt_condition, tb):
        """有则更新,无则插入
            dt = {
                'lock_id': '1',
                'company_id': '2',
                'user_id': '6',
                'start_time': '2022-06-01 17:06:12',
                'expired_time': '2022-07-07 21:37:12'
            }
            ls = [('lock_id', '1'), ('company_id', '2'), ('user_id', '6'), ('start_time', '2022-06-01 17:06:12'),
                ('expired_time', '2022-07-07 21:37:12')]
            sql = lock (lock_id,company_id,user_id,start_time,expired_time)
                        VALUES ('1','2','6','2022-06-01 17:06:12','2022-07-07 21:37:12')
            dt_condition = {
                'lock_id': '1',
                'company_id': '2',
            }
        """
        query = 'SELECT * FROM ' + tb + ' WHERE ' + \
                ' AND '.join('%s=%r' % (k, v) for k, v in dt_condition.items())
        if self.cursor.fetchall(query) == ():
            dt.update(dt_condition)
            self.insert(dt, tb)
        else:
            self.update(dt, dt_condition, tb)

    def replace(self, dt, tb):
        """
        若存在相同数据,会先删除,再重新插入
        缺点:
            1、需要考虑全部数据列,不然会丢失部分列
            2、索引的原因,导致插入效率较低
        """
        ls = [(k, v) for k, v in dt.items() if v is not None]
        sql = 'REPLACE INTO %s (' % tb + ','.join(i[0] for i in ls) + \
              ') VALUES (' + ','.join('%r' % i[1] for i in ls) + ')'
        self.commit(sql)


if __name__ == '__main__':
    m = MySQLManager()

    def get_column_by_list(self, table:str, out_field:str, input_field:str, list_condition:list):
        # 例如:查找一列(column)input_field=user_id,返回一列(column)user_name=output_field
        query = 'SELECT ' + out_field + ' FROM ' + table + ' WHERE ' + \
                ' OR '.join(input_field + ' = ' + str(v) for v in list_condition)
        print(query)
        self.cursor.execute(query)
        columns = [i[0] for i in self.cursor.description]
        length = len(columns)
        elems = self.cursor.fetchall()
        columns_list = list()
        for i in range(length):
            columns_list.append([])
        for elem in elems:
            for i in range(length):
                columns_list[i].append(elem[i])
        result = columns_list[0] if length == 1 else columns_list
        return result
    def dict_insert_or_update(self, dt, dt_condition, tb):
        """有则更新,无则插入
            dt = {
                'lock_id': '1',
                'company_id': '2',
                'user_id': '6',
                'start_time': '2022-06-01 17:06:12',
                'expired_time': '2022-07-07 21:37:12'
            }
            ls = [('lock_id', '1'), ('company_id', '2'), ('user_id', '6'), ('start_time', '2022-06-01 17:06:12'),
                ('expired_time', '2022-07-07 21:37:12')]
            sql = lock (lock_id,company_id,user_id,start_time,expired_time)
                        VALUES ('1','2','6','2022-06-01 17:06:12','2022-07-07 21:37:12')
            dt_condition = {
                'lock_id': '1',
                'company_id': '2',
            }
        """
        query = 'SELECT * FROM ' + tb + ' WHERE ' + \
                ' AND '.join('%s=%r' % (k, v) for k, v in dt_condition.items())
        if self.cursor.fetchall(query) == ():  # 如果 dt_condition 没查到
            dt.update(dt_condition)  # 将dt_condition并入dt数据中,字典append到字典
            self.dict_insert(dt, tb)  # 将dt数据插入
        else:
            self.dict_update(dt, dt_condition, tb) # 查到则更新

  

  



# user_id权限下全部锁,company_id定义的全部lock_set,将被包含的lock_set_id找出,生成selected_set列表返回
m = MySQLManager()
sql_str = 'select lock_id from {} where user_info_id=1'.format('repository_userinfotolock')
authlock_in_user = set(m.columns_list_fetchall(sql_str))  # 用户有权限的 锁列表
sql_str = 'select lock_set_id from {} where company_id=2'.format('repository_lockset')
locksets = m.columns_list_fetchall(sql_str)
selected_set = list()
for lock_set_id in locksets:  # 每一个锁集合对应的 锁列表
    sql_str = 'select lock_id from {} where lock_set_id={}'.format('repository_locksettolock', lock_set_id)
    lock_in_set = set(m.columns_list_fetchall(sql_str))
    print(lock_in_set)
    if lock_in_set.issubset(authlock_in_user):  # 锁集合的锁列表 包含在 用户有权限的锁列表,则记录到select_set列表
        selected_set.append(lock_set_id)
m.close()

  

  

python在使用MySQLdb库的时候,如下方法默认获取的cursor的结果集是tuple结构的。

con = MySQLdb.connect('host',port,'username','passwod','db_name','gbk') 
curosr = con.cursor()  
sql = "select * from test_table"   #test_table : name,age  
cusor = cursor.execute(sql)  
r = cusor.fetchone()  
print r[0]+'\t'+r[1]
cursor.close()  
con.close()

使用DictCursor,这样得到的结果集就是字典形式的了,我们可以用key去获取数据了。  

cursor = con.cursor(cursorclass=MySQLdb.cursors.DictCursor)
cursor.execute(sql)
r = cursor.fetchone()
print r['name']+'\t'+r['age']

 

Python任意字典写入MySQL

 

from pymysql.connections import Connection

class Mysql:
    def __init__(self, password, database, host='localhost', user='root'):
        self.db = Connection(
            user=user,
            password=password,
            host=host,
            database=database,
            port=3306,
            charset='UTF8')
        self.cursor = self.db.cursor()

    def __del__(self):
        self.cursor.close()
        self.db.close()

    def commit(self, sql):
        print(sql)
        try:
            self.cursor.execute(sql)
            self.db.commit()
        except Exception as e:
            print(e)

    def fetchall(self, query):
        self.cursor.execute(query)
        return self.cursor.fetchall()  # 有数据:tuple of tuple;无数据:()

    def insert(self, dict, table):
        ls = [(k, v) for k, v in dict.items() if v is not None]
        sql = 'INSERT %s (' % table + ','.join(i[0] for i in ls) + \
              ') VALUES (' + ','.join('%r' % i[1] for i in ls) + ')'
        self.commit(sql)

    def update(self, dt, dt_condition, tb):
        sql = 'UPDATE %s SET ' % tb + ','.join('%s=%r' % (k, v) for k, v in dt.items()) \
              + ' WHERE ' + ' AND '.join('%s=%r' % (k, v) for k, v in dt_condition.items())
        self.commit(sql)

    def insert_or_update(self, dt, dt_condition, tb):
        """有则更新,无则插入"""
        query = 'SELECT * FROM ' + tb + ' WHERE ' + \
                ' AND '.join('%s=%r' % (k, v) for k, v in dt_condition.items())
        if self.fetchall(query) == ():
            dt.update(dt_condition)
            self.insert(dt, tb)
        else:
            self.update(dt, dt_condition, tb)

  

一、一对一:lock_id查lock_location

def lockidToLocklocation(lockid:int):

 

二、一对多:申请授权id查申请锁列表(list result:dict(lock_id:lock_location))

def summitidToLocklist(summitid:int):

 

三、一对多:用户id查权限锁列表(list result:dict(lock_id:lock_location))

def useridToLocklist(userid:int):

 

四、一对多:公司id查锁列表(list result:dict(lock_id:lock_location))

def companyidToLocklist(companyid:int):

 

五、列表对json列表:锁id查多字段fields和values(list result:dict(field1:value1,field2:value2。。。))

def lockidToDictlist(lockid:list):Jsonlist

 

select查询返回值(默认的tuple元组类型、返回dict字典类型、list列表)

默认的tuple元组类型

import pymysql
def export(table_name):
    conn =pymysql.connect(host = '118.24.3.40',
                          user = 'jxz',password='123456',
                          db='jxz',port=3306,charset = 'utf8')
    cur = conn.cursor()
    cur.execute('select * from %s'%table_name)
    print(cur.fetchall())
export('app_student')

返回dict字典类型

import pymysql
def export(table_name):
    conn =pymysql.connect(host = '118.24.3.40',
                          user = 'jxz',password='123456',
                          db='jxz',port=3306,charset = 'utf8')
    cur = conn.cursor(cursor=pymysql.cursors.DictCursor)
    cur.execute('select * from %s'%table_name)
    print(cur.fetchall())
export('app_student')

list列表  

from itertools import chain
...
sql="select elems from table"
cursor.execute(sql)
elems = cursor.fetchall()
resultlist = list(chain.from_iterable(elems))
...

  

  

 

 

  

posted @ 2022-07-20 16:39  pearlcity  阅读(41)  评论(0编辑  收藏  举报