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