2012-08-04 60 views
10

Hãy tưởng tượng bạn có một từ điển Python có giá trị khóa (hoặc danh sách) với số lượng lớn hơn các mục. Giả sử bạn đang đọc tệp JSON lớn hơn và bạn muốn lưu trữ nội dung của nó vào bảng MySQL bằng các khóa làm tên của các cột và giá trị dưới dạng giá trị.Cách hiệu quả nhất để chèn từ điển/danh sách Python vào cơ sở dữ liệu SQL là gì?

JSON Ví dụ:

"display_location": { 
    "city":"Bratislava", 
    "state_name":"Slovakia", 
    "country_iso3166":"SK", 
    "latitude":"48.20000076", 
    "longitude":"17.20000076", 
} 

Sau đó, nó là khá hiệu quả để viết SQL chèn như tay này:

INSERT INTO TABLE (city, state_name, country_iso3166, latitude, longitude) VALUES('%s','%s','%s','%s','%s') 
% (Bratislava, Slovakia, SK, 48.20000076, 17.20000076); 

(Vâng, đó là ok với năm giá trị, nhưng hãy tưởng tượng có những ví dụ lăm hàng trăm người trong số họ.)

Có bất kỳ lớp/phương thức Python nào để chèn SQL có hiệu quả và chuỗi ngắn không? Tôi đã viết đoạn mã này:

for key,value in list.iteritems(): 
    value_type = type(value) 
    if value_type is unicode: 
     vars_to_sql.append(value.encode('ascii', 'ignore')) 
     keys_to_sql.append(key.encode('ascii', 'ignore')) 
    else: 
     vars_to_sql.append(value) 
     keys_to_sql.append(key) 

keys_to_sql = ', '.join(keys_to_sql) 

Sau đó chèn trông đơn giản hơn nhiều:

INSERT INTO conditions_bratislava(%s) VALUES %r" % (keys_to_sql, tuple(vars_to_sql),) 

Có thể có hàng ngàn các giá trị và bạn vẫn sẽ ổn với tuyên bố một chèn này.

Lưu ý rằng điều kiện sẽ giải mã chuỗi Unicode, vì vậy bạn sẽ không có chữ "u" trước mỗi giá trị.

Vì vậy, có bất kỳ lớp học hoặc phương pháp hiệu quả hơn và chuẩn bị nào để chèn nhiều giá trị trong cùng một phương pháp đơn giản với chuỗi INSERT ngắn không?

+1

Nếu bạn muốn sử dụng cơ sở dữ liệu quan hệ, có thể sử dụng PostgreSQL 9.2 sắp tới có kiểu dữ liệu JSON gốc. –

Trả lời

6

Nếu dữ liệu của bạn được cấu trúc như vậy, nó sẽ tự vay nhiều hơn đối với một cơ sở dữ liệu định hướng tài liệu (Mongo/Couch vv ...)

Bạn có thể nhận được ngay với một cái gì đó như thế này ... Tôi nghĩ rằng sử dụng repr đang được một chút quá thông minh ...

insert_sql = 'INSERT INTO conditions_bratislava(%s) values(%s)' 
cols = ', '.join(somedict) 
vals = ', '.join('?' * len(somedict)) # or whatever qparam is required 
to_execute = insert_sql % (cols, vals) 
some_cursor.execute(to_execute, somedict.values()) 

Trên một mặt lưu ý:

value_type = type(value) 
if value_type is unicode: 

nên được viết như sau:

if isinstance(value, unicode): 
+0

+1 trên 'isinstance' –

+0

Nếu dict được sửa đổi trong chuỗi thứ hai, điều này có thể mang lại thứ tự không chính xác của các giá trị hoặc quá nhiều giá trị. Tôi muốn đi với các thông số được đặt tên thay vì và đi qua toàn bộ từ điển để cursor.execute. – XORcist

+0

@ möter Tôi đã cung cấp phiên bản "chính xác hơn" về những gì OP đang làm. Tôi đồng ý rằng bằng cách sử dụng các thông số được đặt tên là tốt hơn một chút nói chung mặc dù. Tôi cũng hy vọng rằng bất cứ ai sử dụng các chủ đề sẽ đủ thận trọng để sử dụng khóa. –

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