2011-11-11 31 views
5

Tôi đang làm việc với một db từ xa để nhập dữ liệu vào db của proango của Django.Thực hiện các truy vấn khác nhau bằng cách sử dụng mysql-python

Với sự giúp đỡ của MySQLdb tôi đã được quản lý một cách dễ dàng để tạo ra một chức năng nhập khẩu như sau:

def connect_and_get_data(useful_string): 
    CONNECTION = MySQLdb.connect(host=..., port=..., 
           user=..., passwd=..., db=..., 
           cursorclass=MySQLdb.cursors.DictCursor, 
           charset = "utf8") 
    cursor = CONNECTION.cursor() 
    cursor.execute("SELECT ... FROM ... WHERE ... AND some_field=%s", (useful_string)) 
    result = cursor.fetchall() 
    cursor.close() 

Rất hạnh phúc với điều đó, hoạt động như mong đợi.

Nhưng tiếp tục với mã, tôi đã nhận thấy rằng đôi khi tôi sẽ cần phải kết nối lại với db, để thực hiện các truy vấn khác nhau khác.

Ý tưởng đầu tiên là khá hợp lý, với tôi: cho mỗi truy vấn tôi sẽ cần, xác định một chức năng trong đó kêu gọi connect_and_get_data với truy vấn cụ thể như tham số ... một cái gì đó như thế này:

def get_data_about_first_amazing_topic(useful_string): 
    query = "SELECT ... FROM ... WHERE ... AND some_field=%s" %(useful_string) 
    connect_and_get_data(query) 
    ... 

def get_data_about_second_amazing_topic(other_useful_string): 
    query = "SELECT ... FROM ... WHERE ... AND some_field=%s" %(other_useful_string) 
    connect_and_get_data(query) 
    ... 

với sửa đổi này thành connect_and_get_data:

def connect_and_get_data(query): 
    ... 
    cursor.execute(query) 
    ... 

Như bạn đã có thể tưởng tượng, giải pháp này không thành công.

Reading mluebke của câu trả lời cho câu hỏi python mysql fetch query

"Bạn đang đi qua lập luận đến thực hiện chức năng, không làm thay chuỗi python"

tôi hiểu ngay nơi tôi đã sai; nhưng tôi vẫn cảm thấy rằng một cái gì đó bị thiếu: Tôi đã thử các giải pháp khác nhau, nhưng tôi chắc chắn không hài lòng với tất cả chúng.

Có cách nào "tốt" để đóng gói chức năng connect_and_get_data(query) của tôi, để phục vụ tôi theo cách tôi muốn hoặc tôi hoàn toàn sai đường với điều này?

Loại nào được coi là "thực tiễn tốt nhất" trong trường hợp này?

Trả lời

6

Tôi nghĩ rằng đây là những gì bạn đang tìm kiếm.

def connect_and_get_data(query, data): 
    ... 
    cursor.execute(query, data) 
    ... 

def get_data_about_first_amazing_topic(useful_string): 
    query = "SELECT ... FROM ... WHERE ... AND some_field=%s" 
    connect_and_get_data(query, ("one","two","three")) 
    ... 

Tuy nhiên, nếu bạn sắp thực hiện một số truy vấn một cách nhanh chóng, sẽ tốt hơn khi sử dụng lại kết nối của bạn vì việc kết nối quá nhiều có thể lãng phí thời gian.

... 
CONNECTION = MySQLdb.connect(host=..., port=..., 
          user=..., passwd=..., db=..., 
          cursorclass=MySQLdb.cursors.DictCursor, 
          charset = "utf8") 
cursor = CONNECTION.cursor() 
cursor.execute("SELECT ... FROM ... WHERE ... AND some_field=%s", ("first", "amazing", "topic")) 
first_result = cursor.fetchall() 

cursor.execute("SELECT ... FROM ... WHERE ... AND some_field=%s", (("first", "amazing", "topic"))) 
second_result = cursor.fetchall() 

cursor.close() 
... 

Điều này sẽ làm cho mã của bạn hoạt động tốt hơn nhiều.

+0

Có ... Bạn đã đúng! Tôi sẽ hướng tới hướng này ... Nhưng nếu tôi cần hai _useful_strings_ trong truy vấn của mình thì sao? có thể biến 'dữ liệu' thành mảng args ... đúng không? và làm thế nào sẽ phản ứng cursor.execute trong khi nhận được một mảng các chuỗi? mmm ... – dolma33

+1

Bạn có thể sử dụng một bộ tuple (một chuỗi tương tự như một mảng) làm tham số thứ 2 cho 'connect_and_get_data'. 'cursor.execute' chấp nhận tuple làm tham số thứ hai. Tuples chỉ là một chuỗi các phần tử được bao quanh bởi dấu ngoặc đơn, ví dụ: '(" một "," hai "," ba ")'. Trong thực tế, nếu bạn nhìn vào mã của bạn, bạn có thể thấy '(useful_string)' trong dấu ngoặc đơn làm đối số cho 'execute()'. – Kylos

+0

Không thể tái sử dụng kết nối của tôi cho nhiều truy vấn: không may, db từ xa nằm trên máy có kết nối không thực sự (tải xuống dưới 10k) và kết nối siêu ổn định (hoạt động trên một hòn đảo ở giữa Thái Bình Dương có khuyết điểm của anh ấy, và một trong số đó là kết nối vệ tinh chậm) ... vì vậy tôi phải có kết nối db "nguyên tử" ngắn và nhẹ ... – dolma33

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