用于更新重复状态的脚本

时间:2019-07-15 14:50:25

标签: python python-2.7

我正在创建一个脚本,如果对resident_code有任何重复,则会将活动字段更新为false。我遇到的问题是:例如,如果我有5个plicate_inventor实例,并且每个实例都有2个副本,那么我必须多次运行脚本,因为它一次只能更新1个。我需要让他明白,即使有重复,他也必须执行。

#!/usr/bin/python

import logging

import psycopg2

logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s.%(msecs)03d %(levelname)s - %(funcName)s: %(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S',
                    filename="logs/script_cancela-duplicados.log")
conn_adesao = None
cursor_adesao = None



def connect_db_adesao():
    global cursor_adesao, conn_adesao
    host_adesao = ""
    db_adesao = ""
    db_user_adesao = ""
    db_pass_adesao = ""

    conn_adesao = psycopg2.connect(host=host_adesao,
                                   database=db_adesao,
                                   user=db_user_adesao,
                                   password=db_pass_adesao)
    cursor_adesao = conn_adesao.cursor()
    logging.info("Conexao com banco de adesao aberta com sucesso.")

def read_adesao():
    logging.info("Realizando consulta no banco de adesao.")
    sql = 'with tabela_auxiliar as (' \
          'select min(id) as id from assinatura ' \
          'where ativo = true ' \
          'group by codigo_assinante ' \
          'having Count(codigo_assinante) > 1) ' \
          'select codigo_assinante, a.id, ativo from assinatura a ' \
          'join tabela_auxiliar ta on a.id = ta.id ' \
          'where codigo_assinante in (' \
          'select codigo_assinante from assinatura ' \
          'where ativo = true ' \
          'group by codigo_assinante ' \
          'having Count(codigo_assinante) > 1)'
    cursor_adesao.execute(sql)
    total_eventos = cursor_adesao.rowcount
    logging.info("Quantidade de clientes recuperados do banco: {}".format(total_eventos))
    row = cursor_adesao.fetchone()
    while row:
        update_db_adesao(row)
        row = cursor_adesao.fetchone()
    logging.info("Terminou de ler a base de adesao.")


def update_db_adesao(row):
    codigo_assinante = row[0]
    id = row[1]
    logging.info("Cancelando assinatura duplicada codigo_assinante[{}], id[{}]."
                 .format(codigo_assinante, id))
    sql = "update assinatura set ativo = false " \
          "where codigo_assinante = %s " \
          "and id = %s "
    cursor_adesao.execute(sql, (codigo_assinante, id))
    updated_rows = cursor_adesao.rowcount
    logging.info("{} linha(s) atualizada no banco, codigo_assinante[{}], id[{}]."
                 .format(updated_rows, codigo_assinante, id))
    if updated_rows < 1:
        logging.warning("Nao ha atualizacao para o codigo codigo_assinante[{}], id[{}]"
                        .format(codigo_assinante, id))
    conn_adesao.commit()


def close_db():
    if cursor_adesao is not None:
        cursor_adesao.close()
    if conn_adesao is not None:
        conn_adesao.close()
    logging.info("Conexao com banco fechada com sucesso.")


connect_db_adesao()
read_adesao()
close_db()

另一个问题是,即使它一次运行并更新1,我仍然遇到以下错误:

Traceback (most recent call last):
  File "./cancela_duplicados.py", line 81, in <module>
    read_adesao()
  File "./cancela_duplicados.py", line 50, in read_adesao
    row = cursor_adesao.fetchall()
psycopg2.ProgrammingError: no results to fetch

0 个答案:

没有答案