回顾:python连接pg数据库(psycopg2)

友情提示:博主不建议有些博客直接将原来的python重新指向python3,因为自带的python2.7可能会与其他组件有所依赖,建议ln -s {python3的安装路径}/bin/python3 /user/bin/python3 重新创建一个python3的软链接较好

一、psycopg2的connect信息
1、参数信息
- dbname: the database name
- database: the database name (only as keyword argument)
- user: user name used to authenticate
- password: password used to authenticate
- host: database host address (defaults to UNIX socket if not provided)
- port: connection port number (defaults to 5432 if not provided)
2、代码

#!/usr/bin/env python3
# -*- coding:UTF-8 -*-
import psycopg2
import logging
import time

logger = logging.getLogger("root")
logger.setLevel(level=logging.DEBUG)
handler = logging.FileHandler("****")
handler.setLevel(logging.DEBUG)
formatter = logging.Formatter("%(asctime)s %(levelname)s %(message)s", "%Y%b%d-%H:%M:%S")
handler.setFormatter(formatter)
logger.addHandler(handler)
# database,user,password,host,port分别对应要连接的PostgreSQL数据库的
# 数据库名、数据库用户名、用户密码、主机、端口信息
def get_data(sql):
    conn=psycopg2.connect(database="***",user="***",password="***",port="***",host="***")
    cur=conn.cursor()
    try:
        #执行命令
        cur.execute(sql)
        #获取数据
        rows = cur.fetchall()
        #获取所有字段
        all_fields = cur.description
        list_messages=[]
        for i in range(len(rows)):
            dict_messages = {}
            for k in range(len(all_fields)):
                # 格式化输出结果,len参数是各列的显示宽度,可以指定常量,也可自定义函数进行获取。
                dict_messages[all_fields[k][0]]=rows[i][k]
            list_messages.append(dict_messages)
    #返回列表
        return list_messages
    except Exception as e:
        logger.error("获取数据失败,原因是:  "+str(e))
    finally:
        conn.close()
#对获取的数据进行分析和记录
def Analysis_data(list_data):
    if list_data!=[]:
        for i in list_data:
            if i['status']==2:
                logger.debug("转化文件成功"+str(i))
            else:
                if i['status'] == 3:
                    logger.error("转化文件失败"+str(i))
                else:
                    logger.debug("文件正在入库"+str(i))
    else:
        logger.error("分析数据为空")
#维护日志大小,节约空间
def log_size(filepath):
    #维护总数据量
    try:
        with open("****",'w') as w:
            count = 0
            for index, line in enumerate(open(filepath, 'r')):
                count += 1
                if 'ERROR' in line:
                    w.write(line)
        if count>120:
            file=open(filepath,'r')
            read_content=file.readlines()
            file=open(filepath,'w')
            write_content=''.join(read_content[count-120:])
            file.write(write_content)
    except Exception as e:
        logger.error("维护日志失败,原因是"+str(e))

if __name__ == '__main__':
    sql="select * from tl_pof_status order by data_time desc limit 100"
    Analysis_data(get_data(sql))
    log_size("****")

二、途中遇到的问题:
在此过程中,遇到了个在循环过程中,在列表添加字典的问题,仔细考虑下逻辑感觉没啥问题,但是debug的时候发现,list中的元素会跟着dict中元素的改变而改变。百度搜索原因,看到了个说法作为参考:

因为每次添加的都是同一个内存到list中去了,mydict每次写入的时候改变了内存中的value,但是地址不变,即是,创建了一次内存空间,只会不断的改变value了,添加到list中的时候value已经改了。所以需要在for循环里面去每次循环都创建一个空的dict,以保证之前添加过的不会被改变

回顾:python连接pg数据库(psycopg2)_第1张图片
解决:
将定义的空字典,放入外部循环
回顾:python连接pg数据库(psycopg2)_第2张图片

你可能感兴趣的:(回顾:python连接pg数据库(psycopg2))