我正在创建一个脚本,如果对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