2017-06-22 4 views
0

質問私のデータベースから私のview_id列を取得したいだけですが、私は最初のキーのいくつかの連続した番号が欲しいです。以下は私が今までに何か助けが大いに評価されるであろうものです!私の双対の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)] 

は、あなたの期待される結果と一致する必要があります。

ドキュメントから:私は直接cursorを渡している

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]), ... 

注意、ほとんどのDB-APIの実装にカーソルが反復可能そのものです - 怠惰な1あなたは全体の結果セットをロード避けることができるので、あなたはそれを繰り返し処理したいときにメモリ(これは.fetchall()で起こる)です。 TypeError: XXX object is not iterable例外が発生した場合はcursorの代わりにcursor.fetchall()を渡します(そしてpyodbcの保守担当者に連絡してcursorを反復可能にするよう依頼してください)。

+0

あなたは本当にありがとうございます。 @bruno desthuilliers –

+0

説明もありがとう、私は挑戦的にそれを念頭に置いています。 –

関連する問題