2010-11-10 34 views
16

Khi tôi làm someting nhưPython - mysqlDB, kết quả sqlite như từ điển

sqlite.cursor.execute("SELECT * FROM foo") 
result = sqlite.cursor.fetchone() 

Tôi nghĩ rằng phải nhớ thứ tự các cột xuất hiện để có thể lấy chúng ra, ví dụ như

result[0] is id 
result[1] is first_name 

là có cách nào để trả lại một từ điển? vì vậy tôi có thể thay vì chỉ sử dụng kết quả ['id'] hoặc tương tự?

Vấn đề với các cột được đánh số là, nếu bạn viết mã, sau đó chèn cột bạn có thể phải thay đổi mã ví dụ kết quả [1] cho first_name bây giờ có thể là date_joined do đó sẽ phải cập nhật tất cả mã. .

+0

có thể trùng lặp của [Làm thế nào tôi có thể nhận được dict từ truy vấn sql?] (http://stackoverflow.com/questions/3300464/how-can-i-get-dict-from-sqlite -query) Đây có phải là về sqlite hoặc mysql không? –

Trả lời

5

David Beazley có một ví dụ hay về điều này trong số Python Essential Reference của mình.
Tôi không có cuốn sách trong tay, nhưng tôi nghĩ rằng ví dụ của mình là một cái gì đó như thế này: sử dụng

def dict_gen(curs): 
    ''' From Python Essential Reference by David Beazley 
    ''' 
    import itertools 
    field_names = [d[0].lower() for d in curs.description] 
    while True: 
     rows = curs.fetchmany() 
     if not rows: return 
     for row in rows: 
      yield dict(itertools.izip(field_names, row)) 

mẫu:

>>> import sqlite3 
>>> conn = sqlite3.connect(':memory:') 
>>> c = conn.cursor() 
>>> c.execute('create table test (col1,col2)') 
<sqlite3.Cursor object at 0x011A96A0> 
>>> c.execute("insert into test values (1,'foo')") 
<sqlite3.Cursor object at 0x011A96A0> 
>>> c.execute("insert into test values (2,'bar')") 
<sqlite3.Cursor object at 0x011A96A0> 
# `dict_gen` function code here 
>>> [r for r in dict_gen(c.execute('select * from test'))] 
[{'col2': u'foo', 'col1': 1}, {'col2': u'bar', 'col1': 2}] 
4

Bạn có thể làm điều này rất dễ dàng. Đối với SQLite: my_connection.row_factory = sqlite3.Row

Kiểm tra nó ra trên các tài liệu python: http://docs.python.org/library/sqlite3.html#accessing-columns-by-name-instead-of-by-index

UPDATE:

Python 2.6.1 (r261:67515, Feb 11 2010, 00:51:29) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import sqlite3 
>>> conn = sqlite3.connect(':memory:') 
>>> conn.row_factory = sqlite3.Row 
>>> c = conn.cursor() 
>>> c.execute('create table test (col1,col2)') 
<sqlite3.Cursor object at 0x1004bb298> 
>>> c.execute("insert into test values (1,'foo')") 
<sqlite3.Cursor object at 0x1004bb298> 
>>> c.execute("insert into test values (2,'bar')") 
<sqlite3.Cursor object at 0x1004bb298> 
>>> for i in c.execute('select * from test'): print i['col1'], i['col2'] 
... 
1 foo 
2 bar 
+0

Nhờ @Adam cho mẫu tương tác. –

11

Làm điều này trong mysqlDB bạn chỉ cần thêm dòng sau vào chức năng cuộc gọi kết nối

cursorclass = MySQLdb.cursors.DictCursor 
1

một trường hợp sqlite3.Row có thể được chuyển đổi thành dict - rất tiện dụng để kết quả là j con trai

>>> csr = conn.cursor() 
>>> csr.row_factory = sqlite3.Row 
>>> csr.execute('select col1, col2 from test') 
>>> json.dumps(dict(result=[dict(r) for r in csr.fetchall()])) 
+1

điều này mang lại cho tôi một phần tử chuỗi cập nhật từ điển # 0 có độ dài 15; 2 là bắt buộc' – Tobi

29
import MySQLdb 
dbConn = MySQLdb.connect(host='xyz', user='xyz', passwd='xyz', db='xyz') 
dictCursor = dbConn.cursor(MySQLdb.cursors.DictCursor) 
dictCursor.execute("SELECT a,b,c FROM table_xyz") 
resultSet = dictCursor.fetchall() 
for row in resultSet: 
    print row['a'] 
dictCursor.close 
dbConn.close() 
+0

Cảm ơn, nó hoạt động. – swietyy

+0

Có cách nào để thêm các hàng được lấy bởi một 'DictCursor' vào một' set() 'mà không cần chạy vào' TypeError: kiểu không thể khởi động: 'dict''? – ray

+1

Đây phải là câu trả lời chính xác và được chấp nhận. –

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