Mặc dù tôi thích toàn bộ đối tượng được định hướng bằng SQLAlchemy, đôi khi tôi thấy dễ dàng hơn khi trực tiếp sử dụng một số SQL. Và vì các bản ghi không có khóa, chúng tôi cần số hàng (_ROWID_
) để xóa các bản ghi được nhắm mục tiêu và tôi không nghĩ API cung cấp nó.
Vì vậy, đầu tiên chúng tôi kết nối với cơ sở dữ liệu:
from sqlalchemy import create_engine
db = create_engine(r'sqlite:///C:\temp\example.db')
eng = db.engine
Sau đó, để liệt kê tất cả các hồ sơ:
for row in eng.execute("SELECT * FROM TableA;") :
print row
Và để hiển thị tất cả các hồ sơ trùng lặp nơi ngày là giống hệt nhau:
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
Bây giờ chúng tôi đã xác định tất cả các bản sao, chúng có thể cần phải được sửa nếu người khác các lĩnh vực khác nhau:
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' ;");
Và finnally để giữ kỷ lục chèn đầu tiên và xóa các bản ghi trùng lặp gần đây nhất:
print eng.execute("""
DELETE FROM {table}
WHERE _ROWID_ NOT IN (SELECT MIN(_ROWID_) FROM {table} GROUP BY {field});
""".format(table="TableA", field="Date")).rowcount
Hoặc để giữ kỷ lục chèn cuối cùng và xóa các hồ sơ nhân đôi khác:
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: bạn cũng có một cột khóa chính riêng biệt không? Q2: Tại sao bạn có ** 6 ** bảng quan trọng cho câu hỏi này? – van