Python数据处理(数据库篇-1)

本文分享了一位开发者如何使用Python避免繁琐手动操作,通过实现快速计算表中字段总和并更新,以及按省份分析数据占比的功能,提高工作效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记录一次工作中的数据处理
事因:手动操作数据库大量的查询更新、计算等操作,这使得大量的时间流逝,而且还乏味枯燥,所以我利用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() #调用根据省份的总资源数计算出各地方的资源数的批量插入的方法

运行环境:自己常用的编辑器中运行即可

如果看完之后,你是蒙蔽的状态,那说明你没有完全读懂这段代码,如果用来自己使用的话,请务必读懂代码逻辑后,再自行进行修改。

感谢阅读

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

博客网友陈浩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值