Mentre mi piace l'intero approccio orientato agli oggetti con SQLAlchemy, a volte trovo più facile utilizzare direttamente alcuni SQL. E poiché i record non hanno una chiave, abbiamo bisogno del numero di riga (_ROWID_
) per cancellare i record presi come bersaglio e non penso che l'API lo fornisca.
Quindi, prima abbiamo la connessione al database:
from sqlalchemy import create_engine
db = create_engine(r'sqlite:///C:\temp\example.db')
eng = db.engine
Poi per elencare tutti i record:
for row in eng.execute("SELECT * FROM TableA;") :
print row
e di visualizzare tutti i record duplicati in cui sono identiche le date:
for row in eng.execute("""
SELECT * FROM {table}
WHERE {field} IN (SELECT {field} FROM {table} GROUP BY {field} HAVING COUNT(*) > 1)
ORDER BY {field};
""".format(table="TableA", field="Date")) :
print row
Ora che abbiamo identificato tutti i duplicati, probabilmente devono essere corretti se l'altro campi sono diversi:
eng.execute("UPDATE TableA SET NormalA=18, specialA=20 WHERE Date = '2016-18-12' ;");
eng.execute("UPDATE TableA SET NormalA=4, specialA=8 WHERE Date = '2015-18-12' ;");
E finnally per mantenere il primo record inserito ed eliminare i più recenti record duplicati:
print eng.execute("""
DELETE FROM {table}
WHERE _ROWID_ NOT IN (SELECT MIN(_ROWID_) FROM {table} GROUP BY {field});
""".format(table="TableA", field="Date")).rowcount
o per mantenere l'ultimo record inserito ed eliminare gli altri record duplicati:
print eng.execute("""
DELETE FROM {table}
WHERE _ROWID_ NOT IN (SELECT MAX(_ROWID_) FROM {table} GROUP BY {field});
""".format(table="TableA", field="Date")).rowcount
Q1: hai anche una colonna chiave primaria separata? Q2: Perché il fatto di avere ** 6 ** tabelle è importante per questa domanda? – van