记录一次工作中的数据处理
事因:手动操作数据库大量的查询更新、计算等操作,这使得大量的时间流逝,而且还乏味枯燥,所以我利用python进行了这次有针对性的数据处理,建议有一定python基础的朋友读此片文章。
一共实现了两个功能:
1.根据一个表中的指定字段,计算出总和,最后update到此表中或者其他表中的
2.根据一行的内容,计算出此表所有行的内容数据
配置文件:config.py(这里的条件我没在配置文件中写,当时为了为了赶时间,直接写死在了代码中了)
#!encoding=utf-8
'''
作者:陈浩
更新日期:2022.5.12
名称:批量计算总和与根据省份计算该省份各地区的所有数据占比
'''
#连接数据库
postgres = {
'database':'xxxx',
'user':'postgres',
'password':'xxxx',
'host':'192.168.x.x',
'port':5432
}
#查询sql
'''
column:字段 schma_name:模式名 table_name:表名 condition:条件
'''
select = {
'column1':'ywzszmj',
'schma_name':'sd_yw',
'table_name':'ysdzwbh_tb_copy1',
'condition':''
}
#更新sql
'''
column:字段 schma_name:模式名 table_name:表名 condition:条件
'''
update = {
'column1':'ywzszmj',
'schma_name':'sd_yw',
'table_name':'ysdzwbh_tb_copy1',
'view_name':'zqmj_v',
'condition':''
}
#主键id的范围;注意:start的值不可以为0
primarykey_id = {
'start':1,
'stop':155
}
#表名;根据省份资源大小计算各地区的资源占用
table_name = "ysdzwbh_tb"
代码:calculate.py
#!encoding=utf-8
'''
作者:陈浩
更新日期:2022.5.12
名称:批量计算总和与根据省份计算该省份各地区的所有数据占比
'''
import psycopg2 as pgsql
import os.path
import logging
import traceback
from config import postgres
from config import select
from config import update
from config import primarykey_id
from config import table_name
logging.basicConfig(level=logging.DEBUG, filename=os.path.abspath(os.path.dirname(__file__)) + '/calculate.log',
filemode='a', format='%(asctime)s - %(levelname)s: %(message)s')
class Calculate:
"""计算公式的类"""
def conn_pgsql(self):
'''连接数据库的方法'''
conn = None
try:
conn = pgsql.connect(database=postgres['database'], user=postgres['user'],
password=postgres['password'], host=postgres['host'],
port=postgres['port'])
logging.info("数据库连接成功:{}".format(conn))
except Exception as e:
logging.error("pgsql连接错误:\n{}".format(traceback.format_exc()))
if conn != None:
return conn
def get_sql(self):
'''查询sql的方法'''
con_pg = None
try:
con_pg = self.conn_pgsql()
curs = con_pg.cursor()
data = []
for i in range(primarykey_id['start'], primarykey_id['stop']): #控制主键查询的范围,1-154都会查询
curs.execute('SELECT %s,%s,%s,%s,%s,%s FROM %s.%s WHERE pk_uid=%s'
%(select['column1'], select['column2'], select['column3'],
select['column4'], select['column5'], select['column6'],
select['schma_name'], select['table_name'], i))
stdout = curs.fetchall()
data.append(stdout)
logging.warning("执行查询sql的方法结果为:\n{}".format(stdout))
con_pg.commit()
curs.close()
return data
except Exception as e:
logging.error("执行查询sql的方法报错:{}".format(e))
finally:
con_pg.close()
def get_sum(self):
"""计算总和的方法"""
logging.info("进入计算总和的方法")
try:
data_sum = []
for sql in self.get_sql():
for sqls in sql:
new_list = list(filter(None, sqls)) # 过滤掉列表中None
#print(new_list)
sums = sum(new_list)
data_sum.append(sums)
logging.warning("计算出总和结果为:{}".format(sums))
return data_sum
except Exception as e:
logging.error("计算总和报错:{}".format(e))
def update_sql(self):
"""更新数据表的方法"""
logging.info("进入更新数据表的方法")
con_pg = None
try:
con_pg = self.conn_pgsql()
curs = con_pg.cursor()
for index, data in enumerate(self.get_sum(), start=primarykey_id['start']):
curs.execute('UPDATE %s.%s set %s=%s WHERE pk_uid=%s'
%(update['schma_name'], update['table_name'], update['column1'],
data, index))
continue
logging.warning("执行更新sql的方法成功")
con_pg.commit()
curs.close()
except Exception as e:
logging.error("执行更新sql的方法报错:{}".format(traceback.format_exc()))
finally:
con_pg.close()
def desc_table(self):
"""根据表名获取字段名的方法"""
logging.info("进入获取字段名的方法")
con_pg = None
try:
con_pg = self.conn_pgsql()
curs = con_pg.cursor()
curs.execute("SELECT col_description ( A.attrelid, A.attnum ) AS COMMENT, "
"format_type ( A.atttypid, A.atttypmod ) AS TYPE,A.attname AS NAME,A.attnotnull AS NOTNULL "
"FROM pg_class AS C,pg_attribute AS A "
"WHERE C.relname = '%s' AND A.attrelid = C.oid AND A.attnum > 0"%table_name)
stdout = curs.fetchall()
desc_data = []
for i in stdout:
list_data = list(i)
desc_data.append(list_data[2])
logging.warning("获取到表{0}的字段名为\n{1}".format(table_name, desc_data))
con_pg.commit()
curs.close()
return desc_data[4:] #返回从第四个字段开始
except Exception as e:
logging.error("执行获取字段名的方法报错:{}".format(traceback.format_exc()))
finally:
con_pg.close()
def desc_table_data(self):
"""获取山东省的所有字段对应的值的方法"""
logging.info("获取山东省的所有字段对应的值的方法")
con_pg = None
try:
con_pg = self.conn_pgsql()
curs = con_pg.cursor()
curs.execute("SELECT * FROM %s.%s WHERE pk_uid='1'"%(select['schma_name'], select['table_name']))
stdout = curs.fetchall()
list_data = []
for i in stdout:
for data in i:
list_data.append(data)
logging.warning("获取到山东省所有值为{}".format(list_data))
return list_data[4:]
con_pg.commit()
curs.close()
except Exception as e:
logging.error("执行获取山东省的所有字段对应的值的方法报错:{}".format(traceback.format_exc()))
finally:
con_pg.close()
def Updates_table(self):
"""根据字段插入数值的方法"""
logging.info("进入批量插入值的方法")
con_pg = None
try:
con_pg = self.conn_pgsql()
curs = con_pg.cursor()
for column, value in zip(self.desc_table(), self.desc_table_data()):
curs.execute("UPDATE %s.%s SET %s=%s * %s.%s.zb FROM %s.%s WHERE %s.%s.zqcode=%s.%s.zqcode AND %s.%s.nd='2021'"%(
update['schma_name'], update['table_name'], column, value, update['schma_name'], update['view_name'],
update['schma_name'], update['view_name'], update['schma_name'], update['table_name'],
update['schma_name'], update['view_name'], update['schma_name'], update['table_name']))
continue
logging.warning("执行批量插入的方法完成")
con_pg.commit()
curs.close()
except Exception as e:
logging.error("执行批量插入值的方法报错:{}".format(traceback.format_exc()))
finally:
con_pg.close()
if __name__ == '__main__':
"""主程序"""
calculate = Calculate() #调用计算总和的方法
'''两个功能分别对应下方两个函数,打开注释运行即可'''
#calculate.update_sql() #调用求总和计算更新sql的方法
#calculate.Updates_table() #调用根据省份的总资源数计算出各地方的资源数的批量插入的方法
运行环境:自己常用的编辑器中运行即可
如果看完之后,你是蒙蔽的状态,那说明你没有完全读懂这段代码,如果用来自己使用的话,请务必读懂代码逻辑后,再自行进行修改。
感谢阅读