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)) ...

浙公网安备 33010602011771号