2017-06-22 20 views
0

問題我只想從我的數據庫中獲取我的view_id列,但是我想爲我的第一個鍵創建一個序列號。以下是我迄今爲止的幫助將不勝感激!在我的dictonary python上設置默認值

這給了我一個語法錯誤,如果我嘗試設置數作爲第一項:

import pyodbc 

class ShopView(object): 

    def getViews(self): 
    conn = pyodbc.connect(r'DSN=mydb;UID=test;PWD=xxxxxxxxxxxxx') 
    sql = "SELECT DISTINCT view_id FROM [TEST].[dbo].[SHOP_VIEW]" 
    cursor = conn.cursor() 
    cursor.execute(sql) 
    count = 0 
    try: 
     return {'shop_views': 
       [dict(zip(count += 1, [column[0] for column in cursor.description], row)) 
       for row in cursor.fetchall()]} 
    finally: 
     cursor.close() 
     conn.close() 

我也試過,但我得到一個新的錯誤:ValueError: dictionary update sequence element #0 has length 3; 2 is required

try: 
    return {'shop_views': 
      [dict(zip([data[0] for data in str(cursor.rowcount)], [column[0] for column in cursor.description], row)) 
      for row in cursor.fetchall()]} 
finally: 
    cursor.close() 
    conn.close() 

這裏它看起來像什麼現在

{'shop_views': [{'view_id': 'ACTOB'}, {'view_id': 'BANDDIES'}, {'view_id': 'SpareNCLathe'}]} 

這是我想看起來像︰

{'shop_views': [{'count': '1', 'view_id': 'ACTOB'}{'count': '2', 'view_id': 'BANDDIES'}, {'count': '3', 'view_id': 'SpareNCLathe'}]} 

回答

0

未測試(以及不與你的數據庫和連接器),但這樣的:

[dict(count=str(index), view_id=row[0]) for index, row in enumerate(cursor, 1)] 

應該符合您預期的結果。

從DOC:

class enumerate(object) 
| enumerate(iterable[, start]) -> iterator for index, value of iterable 
| 
| Return an enumerate object. iterable must be another object that supports 
| iteration. The enumerate object yields pairs containing a count (from 
| start, which defaults to zero) and a value yielded by the iterable argument. 
| enumerate is useful for obtaining an indexed list: 
|  (0, seq[0]), (1, seq[1]), (2, seq[2]), ... 

請注意,我直接傳遞cursor,在大多數DB-API實現光標本身是一個迭代 - 一個懶惰的一個,這樣就可以避免加載整個結果集內存(這是.fetchall()發生的情況),當你只是想迭代它。如果得到TypeError: XXX object is not iterable異常,則通過cursor.fetchall()而不是cursor(並聯系pyodbc維護人員請求他們使cursor可迭代)。

+0

真棒,你是正確的,非常感謝你! @bruno desthuilliers –

+0

感謝您的解釋,我會堅決地記住這一點。 –