2012-06-27 35 views
19

Tôi đang sử dụng SQlAlchemy. Tôi muốn xóa tất cả các bản ghi có hiệu quả trong cơ sở dữ liệu nhưng tôi không muốn bỏ bảng/cơ sở dữ liệu.Làm thế nào để làm sạch cơ sở dữ liệu, thả tất cả hồ sơ bằng sqlalchemy?

Tôi đã thử với mã sau.

con = engine.connect() 
trans = con.begin() 

con.execute(table.delete()) 
trans.commit() 

Dường như, nó không phải là thứ rất hiệu quả vì tôi đang lặp qua tất cả các bảng trong cơ sở dữ liệu. Một số người có thể gợi ý cho tôi cách làm tốt hơn và hiệu quả hơn không?

Bất kỳ loại trợ giúp nào được đánh giá cao ở đây.

+0

Đối với một số cơ sở dữ liệu tồn tại 'cắt xén' tuyên bố. Nó tạo lại bảng và hoạt động nhanh hơn và không giao dịch. Bạn có thể thực thi nó với SQL thô với engine.execute ('' 'cắt ngắn tablename' '') – varela

+0

@Varela Cảm ơn bạn đã chia sẻ suy nghĩ của mình Tôi muốn viết phương thức/chức năng theo cách nó sẽ hoạt động trên tất cả các cơ sở dữ liệu. Vì 'truncate' là DB phụ thuộc, nó sẽ không phải là lựa chọn đầu tiên của tôi. – Rakesh

+1

Sau đó, không có gì tốt hơn, bạn không thể bỏ qua việc lặp qua các bảng và có thể xóa câu lệnh duy nhất hoạt động cho tất cả các DB. – varela

Trả lời

22

Nếu mô hình của bạn dựa vào lược đồ DB hiện có (thường sử dụng autoload=True), bạn không thể tránh xóa dữ liệu trong mỗi bảng. MetaData.sorted_tables có ích:

for tbl in reversed(meta.sorted_tables): 
    engine.execute(tbl.delete()) 

Nếu mô hình của bạn làm định nghĩa giản đồ hoàn chỉnh, không có gì đơn giản hơn drop_all/create_all là (như đã chỉ ra bởi @ jadkik94).

Hơn nữa, TRUNCATE sẽ không hoạt động trên các bảng được tham chiếu bởi ForeignKeys, điều này hạn chế việc sử dụng đáng kể.

+0

Xin chào. 'meta.tables' hoặc' meta.sorted_tables' của tôi là một danh sách trống vì một số lý do. Tôi có 'meta = sqlalchemy.MetaData (bind = engine)'. Tại sao nó hiển thị trống trong khi cơ sở dữ liệu có bảng? –

+1

Nếu bạn không có mô hình nào được xác định ràng buộc với 'meta' này, sẽ không có bất cứ điều gì. Nhưng nếu bạn không muốn định nghĩa các mô hình, và muốn 'phản ánh' chúng từ cơ sở dữ liệu, bạn cần gọi [' MetaData.reflect'] (http://docs.sqlalchemy.org/en/rel_0_7/core/ schema.html # sqlalchemy.schema.MetaData.reflect) đầu tiên – van

+0

Rất tiếc, cảm ơn sự giúp đỡ của bạn! Chỉ còn một câu hỏi nữa, nếu bạn không phiền. Bây giờ để có được cá thể bảng, tôi có thể thực hiện 'meta.tables ['tasks']', nhưng điều đó có nghĩa là tôi phải nhớ tên lớp ('Tasks') và tên bảng là 'tasks'. Có cách nào để tránh điều đó không? –

7

Đối với tôi đặt tbl.drop(engine) làm việc, nhưng không phải engine.execute(tbl.delete())

SQLAlchemy 0.8.0b2 và Python 2.7.3

Các vấn đề liên quan