2009-12-08 5 views
17

Tôi có một khối dữ liệu, hiện tại là danh sách các phần tử nhưng định dạng khá linh hoạt, tôi muốn nối thêm vào bảng Postgres - trong trường hợp này, mỗi n-tuple tương ứng với một hàng trong DB.Tạo lại Postgres COPY trực tiếp bằng Python?

Những gì tôi đã làm cho đến thời điểm này là viết tất cả các tệp CSV và sau đó sử dụng COPY của postgres để tải hàng loạt tất cả điều này vào cơ sở dữ liệu. Điều này làm việc, nhưng là suboptimal, tôi muốn có thể làm điều này tất cả trực tiếp từ python. Có một phương pháp từ bên trong python để nhân rộng tải loại lớn COPY trong Postgres?

Trả lời

45

Nếu bạn đang sử dụng trình điều khiển psycopg2, con trỏ cung cấp một copy_tocopy_from chức năng mà có thể đọc từ bất kỳ đối tượng tập tin giống như (bao gồm một bộ đệm StringIO).

Có các ví dụ trong các tệp examples/copy_from.pyexamples/copy_to.py đi kèm với psycopg2 source distribution.

đoạn trích này là từ ví dụ copy_from.py:

conn = psycopg2.connect(DSN) 
curs = conn.cursor() 
curs.execute("CREATE TABLE test_copy (fld1 text, fld2 text, fld3 int4)") 

# anything can be used as a file if it has .read() and .readline() methods 
data = StringIO.StringIO() 
data.write('\n'.join(['Tom\tJenkins\t37', 
        'Madonna\t\N\t45', 
        'Federico\tDi Gregorio\t\N'])) 
data.seek(0) 

curs.copy_from(data, 'test_copy') 
+2

niềm vui của tôi ... nếu nó làm việc cho bạn, đừng quên nhấn nút chấp nhận cho câu trả lời này. Tôi đã nhận thấy rằng bạn chưa chấp nhận bất kỳ câu trả lời nào cho các câu hỏi khác của bạn, nhưng dấu kiểm "chấp nhận" giúp những người khác có cùng vấn đề trong nháy mắt, câu trả lời đã giải quyết được vấn đề cho bạn. –

+0

Xin lỗi, tôi thậm chí không nhận thấy dấu kiểm trước đây :) – geoffjentry

+0

Vui lòng sửa đổi điều này để bao gồm các toán tử và mảng vì chúng dường như không hoạt động đối với tôi! –