Add faircot.py
This commit is contained in:
93
faircot.py
Normal file
93
faircot.py
Normal file
@@ -0,0 +1,93 @@
|
||||
import pandas as pd
|
||||
import pyodbc
|
||||
from sqlalchemy import create_engine, text, inspect
|
||||
import re
|
||||
import random
|
||||
import string
|
||||
|
||||
# Connexion SQL Server
|
||||
sql_server_conn_str = (
|
||||
"DRIVER={ODBC Driver 18 for SQL Server};"
|
||||
"SERVER=VPS88.DATACENTER.CSTI;"
|
||||
"DATABASE=FAIRCOT_RC;"
|
||||
"UID=SINGA_META;"
|
||||
"PWD=Start.123;"
|
||||
"TrustServerCertificate=yes;"
|
||||
)
|
||||
|
||||
sql_conn = pyodbc.connect(sql_server_conn_str)
|
||||
|
||||
# Lire toute la vue
|
||||
query = "SELECT * FROM [SINGA_VW_EXECUTION_FOLLOW_UP_BY_AGENT]"
|
||||
df = pd.read_sql(query, sql_conn)
|
||||
print("Colonnes chargées depuis la vue :")
|
||||
print(df.columns.tolist())
|
||||
|
||||
# Connexion PostgreSQL
|
||||
pg_user = "metabase"
|
||||
pg_password = "dsproject"
|
||||
pg_host = "localhost"
|
||||
pg_port = "5432"
|
||||
pg_db = "faircot"
|
||||
|
||||
pg_conn_str = f"postgresql://{pg_user}:{pg_password}@{pg_host}:{pg_port}/{pg_db}"
|
||||
pg_engine = create_engine(pg_conn_str)
|
||||
|
||||
# Nettoyage des noms
|
||||
def normalize_name(name):
|
||||
return re.sub(r'\W+', '_', name.strip().lower())
|
||||
|
||||
# Génération d'un mot de passe fort (utile si tu crées les users)
|
||||
def generate_password(length=12):
|
||||
return ''.join(random.choices(string.ascii_letters + string.digits, k=length))
|
||||
|
||||
# Obtenir la liste unique des agents et clients
|
||||
agents = df['Agent'].dropna().unique()
|
||||
clients = df['Customer'].dropna().unique()
|
||||
|
||||
inspector = inspect(pg_engine)
|
||||
|
||||
# Connexion brute pour exécuter DELETE/TRUNCATE
|
||||
with pg_engine.connect() as conn:
|
||||
trans = conn.begin() # démarrer transaction
|
||||
try:
|
||||
for agent in agents:
|
||||
norm_name = normalize_name(str(agent))
|
||||
table_name = f"agent_{norm_name}"
|
||||
|
||||
agent_df = df[df['Agent'] == agent].copy()
|
||||
|
||||
if table_name in inspector.get_table_names():
|
||||
# La table existe → on la vide puis on recharge
|
||||
conn.execute(text(f'DELETE FROM "{table_name}";'))
|
||||
trans.commit() # valider le DELETE
|
||||
trans = conn.begin() # redémarrer transaction
|
||||
agent_df.to_sql(table_name, pg_engine, if_exists="append", index=False)
|
||||
print(f"♻️ Table mise à jour : {table_name} ({len(agent_df)} lignes)")
|
||||
else:
|
||||
# La table n’existe pas → on la crée
|
||||
agent_df.to_sql(table_name, pg_engine, if_exists="replace", index=False)
|
||||
print(f"✅ Table créée : {table_name} ({len(agent_df)} lignes)")
|
||||
|
||||
for client in clients:
|
||||
norm_name = normalize_name(str(client))
|
||||
table_name = f"customer_{norm_name}"
|
||||
|
||||
client_df = df[df['Customer'] == client].copy()
|
||||
|
||||
if table_name in inspector.get_table_names():
|
||||
conn.execute(text(f'DELETE FROM "{table_name}";'))
|
||||
trans.commit() # valider le DELETE
|
||||
trans = conn.begin()
|
||||
client_df.to_sql(table_name, pg_engine, if_exists="append", index=False)
|
||||
print(f"♻️ Table mise à jour : {table_name} ({len(client_df)} lignes)")
|
||||
else:
|
||||
client_df.to_sql(table_name, pg_engine, if_exists="replace", index=False)
|
||||
print(f"✅ Table créée : {table_name} ({len(client_df)} lignes)")
|
||||
|
||||
trans.commit()
|
||||
except Exception as e:
|
||||
trans.rollback()
|
||||
print("⚠️ Erreur :", e)
|
||||
|
||||
print("\n🎉 Transfert terminé (tables créées ou mises à jour, droits conservés).")
|
||||
Reference in New Issue
Block a user