2015-12-31 25 views
1

一個項目是否有一個乾淨的方式從psycopg2DictRow對象中刪除的項目(包括它的價值和指數)?刪除DictRow

我使用psycopg2使用兩個不同的PostgreSQL數據庫進行交互。我想記錄從一個數據庫複製爲DictRow其他 - 我想將它們插入前刪除一對夫婦從記錄的字段。

舉例來說,如果我有一個名爲DictRow row

>>> print row 
[12, '2015-12-31', 'kefir sriracha put a bird on it'] 

>>> print row.keys() 
['id', 'created_at', 'output_example'] 

使用row.pop(INDEX)更改列表的索引,所以儲存在row._index屬性鍵不再正確!

>>> row.pop(0) 
12 

>>> print row 
['2015-12-31', 'kefir sriracha put a bird on it'] 

>>> print row.keys() 
['id', 'created_at', 'output_example'] 

>>> print row['id'] 
'2015-12-31' # GAAAAA!!! 

不能使用使用del row['id']TypeError。我認爲這是因爲底層對象是list並且期望一個整數索引。

我目前的解決辦法是做這樣的事情,這似乎不雅:

fields = [f for f in row.keys() if f != 'id'] 
values = [v for k, v in row.iteritems() if k != 'id'] 

任何建議從DictRow刪除項目的更直接的方式?

+1

你如何使用row.keys()?是不是「行」列表中的例子? – kmario23

+0

它看起來像一個完全錯誤的方法。你能解釋一下爲什麼你需要去Python的旅程並回到Postgresql? –

+0

@ kmario23:這是根據列表中的對象,但它是一個'DictRow':http://initd.org/psycopg/docs/extras.html –

回答

0

使用RealDictCursor

cursor = conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor) 
query = """select 1 as one, 2 as two""" 
cursor.execute(query) 
rs = cursor.fetchall() 
d = rs[0] 
print d 
del(d['one']) 
print d 

輸出:

{'two': 2, 'one': 1} 
{'two': 2} 
+0

我不得不重構一堆依賴於DictCursor代碼,所以我不願意做這種方式。 –

1

我一直在使用這個解決方案是採取DictRow並將其轉換爲一個dict

my_row = dict(row.items()) 
del my_row['id'] 

fields = my_row.keys() 
values = my_row.values() 

它改變了數據類型,所以它不是我提出的問題的一個很好的答案。在這種特定情況下,它比重構依賴於相同遊標及其行爲的其他代碼更容易。