2009-02-23 22 views
11

Tôi có một số mã mà tôi đã sử dụng để truy vấn MySQL, và tôi hy vọng sẽ sử dụng nó với SQLite. Hy vọng thực sự của tôi là điều này sẽ không liên quan đến việc thực hiện quá nhiều thay đổi đối với mã. Thật không may, các mã sau đây không làm việc với SQLite:Làm thế nào tôi có thể tham khảo các cột theo tên của chúng trong python gọi là SQLite?

cursor.execute(query) 

rows = cursor.fetchall() 

data = [] 
for row in rows 
    data.append(row["column_name"]) 

này cung cấp cho các lỗi sau:

TypeError: tuple indices must be integers 

Trong khi đó nếu tôi thay đổi tài liệu tham khảo để sử dụng một số cột, nó hoạt động tốt:

data.append(row[1]) 

Tôi có thể thực hiện truy vấn theo cách mà tôi có thể tham chiếu cột theo tên của chúng không?

Trả lời

11

Tôi không chắc chắn nếu điều này là cách tiếp cận tốt nhất, nhưng đây là những gì tôi thường làm để lấy một kỷ lục thiết lập bằng cách sử dụng DB-API 2 mô-đun compliant:

cursor.execute("""SELECT foo, bar, baz, quux FROM table WHERE id = %s;""", 
        (interesting_record_id,)) 

for foo, bar, baz, quux in cursor.fetchall(): 
    frobnicate(foo + bar, baz * quux) 

Phương pháp định dạng truy vấn là một trong những các tiêu chuẩn DB-API, nhưng xảy ra là phương pháp ưa thích cho Psycopg2; các bộ điều hợp DB-API khác có thể đề xuất một quy ước khác sẽ ổn. Viết các truy vấn như thế này, nơi giải nén ngầm được sử dụng để làm việc với tập kết quả, thường có hiệu quả hơn với tôi hơn là cố gắng lo lắng về việc khớp tên biến của Python với tên cột SQL (mà tôi thường chỉ sử dụng để thả tiền tố, và sau đó chỉ khi tôi đang làm việc với một tập hợp con các tên cột sao cho các tiền tố không giúp làm rõ mọi thứ nữa), và là nhiều hơn tốt hơn so với ghi nhớ các ID cột số.

Kiểu này cũng giúp bạn tránh SELECT * FROM table..., đây chỉ là một thảm họa bảo trì cho bất kỳ điều gì ngoại trừ các bảng và truy vấn đơn giản nhất.

Vì vậy, không chính xác câu trả lời bạn đã yêu cầu, nhưng có thể khai sáng dù sao.

+0

Thực ra, điều đó hoàn hảo! Cảm ơn bạn. – Ben

+0

Xin lỗi: nên kiểm tra cẩn thận hơn. Nó không hoàn toàn hiệu quả. Với SQLite, foo kết thúc là một cái gì đó như (123,) trong khi với MySQL nó kết thúc lên ('foo': 123) – Ben

+0

Nhận kết quả như vậy làm cho tôi tự hỏi nếu mô-đun MySQL của bạn là DB-API 2.0 tuân thủ ... nếu nó không, cố gắng thay thế một mô-đun cơ sở dữ liệu khác sẽ trở nên xấu xí. Bạn đang sử dụng mô-đun MySQL nào? – kquinn

13

Để truy cập các cột theo tên, hãy sử dụng thuộc tính row_factory của cá thể Kết nối. Nó cho phép bạn thiết lập một hàm nhận các đối số cursorrow và trả lại bất kỳ thứ gì bạn muốn. Có một vài nội dung dựng sẵn cho pysqlite, cụ thể là sqlite3.Row, thực hiện những gì bạn đã hỏi.

+0

Trong tài liệu: http://docs.python.org/library/sqlite3.html#accessing-columns-by-name-instead-of-by-index – chaimp

1

API SQLite hỗ trợ cursor.description vì vậy bạn có thể dễ dàng làm điều đó như thế này

headers = {} 
for record in cursor.fetchall(): 
    if not headers: 
     headers = dict((desc[0], idx) for idx,desc in cursor.description)) 
    data.append(record[headers['column_name']]) 

Một chút hơi dài nhưng được công việc làm. Tôi nhận thấy họ thậm chí có nó trong file factory.py dưới dict_factory.

1

câu trả lời Kushal để this forum hoạt động tốt:

Use a DictCursor:

import MySQLdb.cursors 

. 
. 
. 
cursor = db.cursor (MySQLdb.cursors.DictCursor) 
cursor.execute (query) 
rows = cursor.fetchall() 

for row in rows: 
print row['employee_id'] 

Xin lưu ý rằng tên cột phân biệt chữ hoa chữ thường.

+1

Thật đáng tiếc, câu trả lời này là trái ngược với câu hỏi sai (sqlite thay vì mysql) vì nó trả lời hoàn toàn vấn đề của tôi. –

11

Trong năm năm kể từ khi câu hỏi được hỏi và sau đó trả lời, một giải pháp rất đơn giản đã phát sinh. Bất kỳ mã mới nào cũng có thể đơn giản quấn đối tượng kết nối với một nhà máy hàng. Ví dụ về mã:

import sqlite3 

conn = sqlite3.connect('./someFile') 
conn.row_factory = sqlite3.Row  // Here's the magic! 

cursor = conn.execute("SELECT name, age FROM someTable") 
for row in cursor: 
    print(row['name']) 

Dưới đây là một số fine docs. Thưởng thức!

+0

Câu trả lời tương tự đã được đăng 2 năm trước câu trả lời này. – 7stud

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