Mi código se atasca en el clean_up()
método enMyClass()
my_class.py:
import os
import pandas as pd
import psycopg2, pymysql, pyodbc
from db_credentials_dict import db_credentials
class MyClass():
def __init__(self, from_database, to_table_name, report_name):
...
def get_sql(self):
...
def get_connection(self):
...
def query_to_csv(self):
...
def csv_to_postgres(self):
...
def extract_and_load(self):
self.query_to_csv()
self.csv_to_postgres()
def get_final_sql(self):
...
def postgres_to_csv(self):
...
def clean_up(self):
print('\nTruncating {}...'.format(self.to_table_name), end='')
with self.postgres_connection.cursor() as cursor:
cursor.execute("SELECT NOT EXISTS (SELECT 1 FROM %s)" % self.to_table_name)
empty = cursor.fetchone()[0]
if not empty:
cursor.execute("TRUNCATE TABLE %s" % self.to_table_name)
self.postgres_connection.commit()
print('DONE')
print('Removing {}...'.format(self.filename), end='')
if os.path.exists(self.filepath):
os.remove(self.filepath)
print('DONE')
else:
print('{} does not exist'.format(self.filename))
main.py:
from my_class import MyClass
from time import sleep
bookings = MyClass(from_database='...',to_table_name='...',report_name='...')
bookings2 = MyClass(from_database='...',to_table_name='...',report_name='...')
channel = MyClass(from_database='...',to_table_name='...',report_name='...')
cost = MyClass(from_database='...',to_table_name='...',report_name='...')
tables = [bookings, bookings2, channel, cost]
for table in tables:
table.extract_and_load()
daily_report = MyClass(from_database='...',to_table_name='...',report_name='...')
daily_report.postgres_to_csv()
sleep(10)
for table in tables:
table.clean_up()
Cuando ejecuto main.py
ejecuta todo hasta el ciclo final, es decir for table in tables: table.clean_up()
. Simplemente se queda atascado allí, sin errores ni advertencias.
Cuando ejecuta ese método por sí solo, funciona bien, es decir, trunca las tablas de postgres. Necesita ayuda para que esto funcione y comprender por qué el método final no se ejecuta cuando se ejecutan todos los demás.
Salida de cuando se ejecuta clean_up()
por sí solo:
Truncating bookings...DONE
Removing bookings.csv...DONE
Truncating bookings2...DONE
Removing bookings2.csv...DONE
Truncating channel...DONE
Removing channel.csv...DONE
Truncating cost...DONE
Removing cost.csv...DONE
Lo que hace el código general:
- Capturar archivos que contienen consultas sql extrayendo datos de diferentes bases de datos y ejecutando esas consultas.
- Exportándolos a csv
- Importar csv a una base de datos postgres
- Escribir una consulta postgres que reúna datos y luego los exporte como un csv para usar en una herramienta de BI para la visualización de datos
- Truncar los datos en postgres y eliminar los archivos csv en el punto 2
Probablemente estés pensando que esto es una locura y estoy de acuerdo. Actualmente estoy cumpliendo con lo que tengo y no puedo almacenar datos en mi computadora porque son datos de la compañía (de ahí el truncamiento y la eliminación de los datos).
fuente
Respuestas:
TRUNCATE
La cláusula en Postgres requiere unACCESS EXCLUSIVE
bloqueo en la relación y también puede activar algunosBEFORE TRUNCATE
desencadenantes.Supongo que el problema está en el lado de Postgres, por ejemplo,
TRUNCATE
intenta adquirir unACCESS EXCLUSIVE
bloqueo en la relación, pero ya está bloqueado por otra persona.Primero, verifique sus registros de Postgres.
A continuación, verifique qué están haciendo sus backends de Postgres durante su ahorcado
TRUNCATE
con:A continuación, investigue las cerraduras con:
fuente
SELECT * FROM pg_stat_activity WHERE backend_type = 'client backend' AND datname IS NOT NULL;
Te sugiero que hagas el proceso de limpieza deseado en una sola transacción. Para prevenir estados no deseados.
Y verifique si la tabla existe en la base de datos utilizando el esquema de información
Marque Si existe, cree sus comandos truncados.
y ejecuta el proceso de limpieza todo en una transacción.
fuente